diff --git a/Deploy.md b/Deploy.md new file mode 100644 index 0000000..5951295 --- /dev/null +++ b/Deploy.md @@ -0,0 +1,83 @@ +# Deploy the model on your real Unitree robot + +This version shows an example of how to deploy the model on the Unittree Go1 robot (with Nvidia Jetson NX). + +## Install dependencies on Go1 +To deploy the trained model on Go1, please set up a folder on your robot, e.g. `parkour`, and copy the `rsl_rl` folder to it. Then, extract the zip files in `go1_ckpts` to the `parkour` folder. Finally, copy all the files in `onboard_script` to the `parkour` folder. + +1. Install ROS and the [unitree ros package for Go1](https://github.com/Tsinghua-MARS-Lab/unitree_ros_real.git) and follow the instructions to set up the robot on branch `go1` + + Assuming the ros workspace is located in `parkour/unitree_ws` + +2. Install pytorch on a Python 3 environment. (take the Python3 virtual environment on Nvidia Jetson NX as an example) + ```bash + sudo apt-get install python3-pip python3-dev python3-venv + python3 -m venv parkour_venv + source parkour_venv/bin/activate + ``` + Download the pip wheel file from [here](https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048) with v1.10.0. Then install it with + ```bash + pip install torch-1.10.0-cp36-cp36m-linux_aarch64.whl + ``` + +3. Install other dependencies and `rsl_rl` + ```bash + pip install numpy==1.16.4 numpy-ros + pip install -e ./rsl_rl + ``` + +4. 3D print the camera mount for Go1 using the step file in `go1_ckpts/go1_camMount_30Down.step`. Use the two pairs of screw holes to mount the Intel Realsense D435i camera on the robot, as shown in the picture below. + +

+ +

+ +## Run the model on Go1 + +***Disclaimer:*** *Always put a safety belt on the robot when the robot moves. The robot may fall down and cause damage to itself or the environment.* + +1. Put the robot on the ground, power on the robot, and turn the robot into developer mode. Make sure your Intel Realsense D435i camera is connected to the robot and the camera is installed on the mount. + +2. Launch 3 terminals onboard (whether 3 ssh connections from your computer or something else), named T_ros, T_visual, T_gru. + + +3. In T_ros, run + ```bash + cd parkour/unitree_ws + source devel/setup.bash + roslaunch unitree_legged_real robot.launch + ``` + This will launch the ros node for Go1. Please note that without `dryrun:=False` the robot will not move but do anything else. Set `dryrun:=False` only when you are ready to let the robot move. + +4. In T_visual, run + ```bash + cd parkour + source unitree_ws/devel/setup.bash + source parkour_venv/bin/activate + python go1_visual_embedding.py --logdir Nov02... + ``` + where `Nov02...` is the logdir of the trained model. + + Wait for the script to finish loading the model and get access to the Realsense sensor pipeline. Then, you can see the script prompting you: `"Realsense frame received. Sending embeddings..."` + + Adding the `--enable_vis` option will enable the depth image message as a rostopic. You can visualize the depth image in rviz. + +5. In T_gru, run + ```bash + cd parkour + source unitree_ws/devel/setup.bash + source parkour_venv/bin/activate + python a1_ros_run.py --mode upboard --logdir Nov02... + ``` + where `Nov02...` is the logdir of the trained model. + + If the ros node is launched with `dryrun:=False`, the robot will start standing up. Otherwise, add `--debug` option on `a1_ros_run.py` to see the model output. + + If the ros node is launched with `dryrun:=False`, the script will prompt you: `"Robot stood up! press R1 on the remote control to continue ..."` Press R1 on the remote control to start the standing policy + + Pushing R-Y forward on the remote control to trigger the parkour policy. The robot will start running and jumping. Release the joystick to stop the robot. + + Press R2 on the remote control to shutdown the gru script and the ros node. You can also use it in case of emergency. + + Using the `--walkdir` option to load the walking policy e.g. (Oct24_16...), the standing policy will be replaced by the walking policy. Then you can use L-Y, L-X to control the x/y velocity of the robot and use R-X to control the yaw velocity of the robot. + diff --git a/README.md b/README.md index f56a0f0..3e8c93e 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,8 @@ Conference on Robot Learning (CoRL) 2023, Oral
To install and run the code for training A1 in simulation, please clone this repository and follow the instructions in [legged_gym/README.md](legged_gym/README.md). ## Hardware Deployment ## -TODO +To deploy the trained model on your real robot, please follow the instructions in [Deploy.md](Deploy.md). + ## Trouble Shooting ## If you cannot run the distillation part or all graphics computing goes to GPU 0 dispite you have multiple GPUs and have set the CUDA_VISIBLE_DEVICES, please use docker to isolate each GPU. @@ -35,7 +36,7 @@ If you cannot run the distillation part or all graphics computing goes to GPU 0 ## To Do (will be done before Nov 2023) ## - [ ] Go1 training pipeline in simulation - [ ] A1 deployment code -- [ ] Go1 deployment code +- [x] Go1 deployment code ## Citation ## If you find this project helpful to your research, please consider cite us! This is really important to us. diff --git a/go1_ckpts/Nov02_16-18-16_674k_distill_crawljumpjumpleap_vDelay0.25-0.30_camPitch0.52_depthMax2.0_jumpNov02_11-07-49_leapVel1.5_jumpOffset0.05_oracleResetWhenSkill_fricMax2.0_noTanh_fromOct28_16-16-58.zip b/go1_ckpts/Nov02_16-18-16_674k_distill_crawljumpjumpleap_vDelay0.25-0.30_camPitch0.52_depthMax2.0_jumpNov02_11-07-49_leapVel1.5_jumpOffset0.05_oracleResetWhenSkill_fricMax2.0_noTanh_fromOct28_16-16-58.zip new file mode 100644 index 0000000..b52faee Binary files /dev/null and b/go1_ckpts/Nov02_16-18-16_674k_distill_crawljumpjumpleap_vDelay0.25-0.30_camPitch0.52_depthMax2.0_jumpNov02_11-07-49_leapVel1.5_jumpOffset0.05_oracleResetWhenSkill_fricMax2.0_noTanh_fromOct28_16-16-58.zip differ diff --git a/go1_ckpts/Oct24_16-46-16_107k_WalkByRemote_rLinTrack2.0_pActRate1e-1_softDof0.6_noTanh_zeroResetAction_hackReset_EntropyCoef0.01_actionCliphard_fromOct24_15-05-23.zip b/go1_ckpts/Oct24_16-46-16_107k_WalkByRemote_rLinTrack2.0_pActRate1e-1_softDof0.6_noTanh_zeroResetAction_hackReset_EntropyCoef0.01_actionCliphard_fromOct24_15-05-23.zip new file mode 100644 index 0000000..f5df556 Binary files /dev/null and b/go1_ckpts/Oct24_16-46-16_107k_WalkByRemote_rLinTrack2.0_pActRate1e-1_softDof0.6_noTanh_zeroResetAction_hackReset_EntropyCoef0.01_actionCliphard_fromOct24_15-05-23.zip differ diff --git a/go1_ckpts/go1_camMount_30Down.step b/go1_ckpts/go1_camMount_30Down.step new file mode 100644 index 0000000..bdb9e7d --- /dev/null +++ b/go1_ckpts/go1_camMount_30Down.step @@ -0,0 +1,4211 @@ +ISO-10303-21; +HEADER; + +/* File generated by Shapr3D Version 3.0 */ + +FILE_DESCRIPTION(('HOOPS Exchange Step'),'2;1'); + +FILE_NAME('/private/var/mobile/Containers/Data/Application/DA96FF07-AD28-45DC-BFF3-2353ED778072/tmp/export/temp_export', +'2023-11-07T01:17:47-05:00', +('mobile'), +('Shapr3D Limited'), +'HOOPS Exchange 2023.2', +'Shapr3D', +'Authorized'); + +FILE_SCHEMA( ('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }') ); + +ENDSEC; + +DATA; +#3=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.)); +#4=PLANE_ANGLE_MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(0.0174532925),#3); +#5=(CONVERSION_BASED_UNIT('DEGREE',#4)NAMED_UNIT(#6)PLANE_ANGLE_UNIT()); +#6=DIMENSIONAL_EXPONENTS(0.,0.,0.,0.,0.,0.,0.); +#7=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT()); +#8=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.)); +#9=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.000000E-05),#8,'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); +#10=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#9))GLOBAL_UNIT_ASSIGNED_CONTEXT((#8,#5,#7))REPRESENTATION_CONTEXT('','root')); +#12=CARTESIAN_POINT('',(0.,0.,0.)); +#13=DIRECTION('',(0.,0.,1.)); +#14=DIRECTION('',(1.,0.,0.)); +#15=AXIS2_PLACEMENT_3D('',#12,#13,#14); +#27=CARTESIAN_POINT('',(20.,0.,0.)); +#28=DIRECTION('',(1.,0.,0.)); +#29=DIRECTION('',(0.,1.,0.)); +#30=AXIS2_PLACEMENT_3D('',#27,#28,#29); +#31=PLANE('',#30); +#32=CARTESIAN_POINT('',(20.,2.384358327,8.853797026)); +#33=VERTEX_POINT('',#32); +#34=CARTESIAN_POINT('',(20.,-15.854009142,26.666750919)); +#35=VERTEX_POINT('',#34); +#36=CARTESIAN_POINT('',(20.,2.384358327,8.853797026)); +#37=DIRECTION('',(0.,-0.715400991,0.69871412)); +#38=VECTOR('',#37,25.493908573); +#39=LINE('',#36,#38); +#40=EDGE_CURVE('',#33,#35,#39,.T.); +#41=ORIENTED_EDGE('',*,*,#40,.T.); +#42=CARTESIAN_POINT('',(20.,5.485205765,26.666750919)); +#43=VERTEX_POINT('',#42); +#44=CARTESIAN_POINT('',(20.,-15.854009142,26.666750919)); +#45=DIRECTION('',(0.,1.,0.)); +#46=VECTOR('',#45,21.339214907); +#47=LINE('',#44,#46); +#48=EDGE_CURVE('',#35,#43,#47,.T.); +#49=ORIENTED_EDGE('',*,*,#48,.T.); +#50=CARTESIAN_POINT('',(20.,12.062407326,23.810074094)); +#51=VERTEX_POINT('',#50); +#52=CARTESIAN_POINT('',(20.,5.485205765,17.666750919)); +#53=DIRECTION('',(-1.,-0.,-0.)); +#54=DIRECTION('',(0.,0.,-1.)); +#55=AXIS2_PLACEMENT_3D('',#52,#53,#54); +#56=CIRCLE('',#55,9.); +#57=EDGE_CURVE('',#43,#51,#56,.T.); +#58=ORIENTED_EDGE('',*,*,#57,.T.); +#59=CARTESIAN_POINT('',(20.,22.857448803,12.25262194)); +#60=VERTEX_POINT('',#59); +#61=CARTESIAN_POINT('',(20.,12.062407326,23.810074094)); +#62=DIRECTION('',(0.,0.682591464,-0.730800173)); +#63=VECTOR('',#62,15.814791202); +#64=LINE('',#61,#63); +#65=EDGE_CURVE('',#51,#60,#64,.T.); +#66=ORIENTED_EDGE('',*,*,#65,.T.); +#67=CARTESIAN_POINT('',(20.,28.001846852,8.)); +#68=VERTEX_POINT('',#67); +#69=CARTESIAN_POINT('',(20.,41.858253313,30.)); +#70=DIRECTION('',(1.,0.,0.)); +#71=DIRECTION('',(0.,0.,-1.)); +#72=AXIS2_PLACEMENT_3D('',#69,#70,#71); +#73=CIRCLE('',#72,26.); +#74=EDGE_CURVE('',#60,#68,#73,.T.); +#75=ORIENTED_EDGE('',*,*,#74,.T.); +#76=CARTESIAN_POINT('',(20.,4.480500687,8.)); +#77=VERTEX_POINT('',#76); +#78=CARTESIAN_POINT('',(20.,28.001846852,8.)); +#79=DIRECTION('',(0.,-1.,0.)); +#80=VECTOR('',#79,23.521346166); +#81=LINE('',#78,#80); +#82=EDGE_CURVE('',#68,#77,#81,.T.); +#83=ORIENTED_EDGE('',*,*,#82,.T.); +#84=CARTESIAN_POINT('',(20.,4.480500687,11.)); +#85=DIRECTION('',(1.,0.,0.)); +#86=DIRECTION('',(0.,0.,-1.)); +#87=AXIS2_PLACEMENT_3D('',#84,#85,#86); +#88=CIRCLE('',#87,3.); +#89=EDGE_CURVE('',#33,#77,#88,.T.); +#90=ORIENTED_EDGE('',*,*,#89,.F.); +#91=EDGE_LOOP('',(#41,#49,#58,#66,#75,#83,#90)); +#92=FACE_BOUND('',#91,.T.); +#93=ADVANCED_FACE('',(#92),#31,.F.); +#94=CARTESIAN_POINT('',(-20.,0.,0.)); +#95=DIRECTION('',(-1.,0.,0.)); +#96=DIRECTION('',(0.,1.,0.)); +#97=AXIS2_PLACEMENT_3D('',#94,#95,#96); +#98=PLANE('',#97); +#99=CARTESIAN_POINT('',(-20.,4.480500687,8.)); +#100=VERTEX_POINT('',#99); +#101=CARTESIAN_POINT('',(-20.,28.001846852,8.)); +#102=VERTEX_POINT('',#101); +#103=CARTESIAN_POINT('',(-20.,4.480500687,8.)); +#104=DIRECTION('',(-0.,1.,-0.)); +#105=VECTOR('',#104,23.521346166); +#106=LINE('',#103,#105); +#107=EDGE_CURVE('',#100,#102,#106,.T.); +#108=ORIENTED_EDGE('',*,*,#107,.T.); +#109=CARTESIAN_POINT('',(-20.,22.857448803,12.25262194)); +#110=VERTEX_POINT('',#109); +#111=CARTESIAN_POINT('',(-20.,41.858253313,30.)); +#112=DIRECTION('',(-1.,0.,0.)); +#113=DIRECTION('',(0.,0.,1.)); +#114=AXIS2_PLACEMENT_3D('',#111,#112,#113); +#115=CIRCLE('',#114,26.); +#116=EDGE_CURVE('',#102,#110,#115,.T.); +#117=ORIENTED_EDGE('',*,*,#116,.T.); +#118=CARTESIAN_POINT('',(-20.,12.062407326,23.810074094)); +#119=VERTEX_POINT('',#118); +#120=CARTESIAN_POINT('',(-20.,22.857448803,12.25262194)); +#121=DIRECTION('',(-0.,-0.682591464,0.730800173)); +#122=VECTOR('',#121,15.814791202); +#123=LINE('',#120,#122); +#124=EDGE_CURVE('',#110,#119,#123,.T.); +#125=ORIENTED_EDGE('',*,*,#124,.T.); +#126=CARTESIAN_POINT('',(-20.,5.485205765,26.666750919)); +#127=VERTEX_POINT('',#126); +#128=CARTESIAN_POINT('',(-20.,5.485205765,17.666750919)); +#129=DIRECTION('',(1.,-0.,-0.)); +#130=DIRECTION('',(0.,0.,1.)); +#131=AXIS2_PLACEMENT_3D('',#128,#129,#130); +#132=CIRCLE('',#131,9.); +#133=EDGE_CURVE('',#119,#127,#132,.T.); +#134=ORIENTED_EDGE('',*,*,#133,.T.); +#135=CARTESIAN_POINT('',(-20.,-15.854009142,26.666750919)); +#136=VERTEX_POINT('',#135); +#137=CARTESIAN_POINT('',(-20.,5.485205765,26.666750919)); +#138=DIRECTION('',(-0.,-1.,-0.)); +#139=VECTOR('',#138,21.339214907); +#140=LINE('',#137,#139); +#141=EDGE_CURVE('',#127,#136,#140,.T.); +#142=ORIENTED_EDGE('',*,*,#141,.T.); +#143=CARTESIAN_POINT('',(-20.,2.384358327,8.853797026)); +#144=VERTEX_POINT('',#143); +#145=CARTESIAN_POINT('',(-20.,-15.854009142,26.666750919)); +#146=DIRECTION('',(0.,0.715400991,-0.69871412)); +#147=VECTOR('',#146,25.493908573); +#148=LINE('',#145,#147); +#149=EDGE_CURVE('',#136,#144,#148,.T.); +#150=ORIENTED_EDGE('',*,*,#149,.T.); +#151=CARTESIAN_POINT('',(-20.,4.480500687,11.)); +#152=DIRECTION('',(-1.,0.,0.)); +#153=DIRECTION('',(0.,0.,1.)); +#154=AXIS2_PLACEMENT_3D('',#151,#152,#153); +#155=CIRCLE('',#154,3.); +#156=EDGE_CURVE('',#100,#144,#155,.T.); +#157=ORIENTED_EDGE('',*,*,#156,.F.); +#158=EDGE_LOOP('',(#108,#117,#125,#134,#142,#150,#157)); +#159=FACE_BOUND('',#158,.T.); +#160=ADVANCED_FACE('',(#159),#98,.F.); +#161=CARTESIAN_POINT('',(0.,62.,5.)); +#162=DIRECTION('',(-0.,0.,1.)); +#163=DIRECTION('',(1.,0.,0.)); +#164=AXIS2_PLACEMENT_3D('',#161,#162,#163); +#165=PLANE('',#164); +#166=CARTESIAN_POINT('',(-10.75,52.,5.)); +#167=VERTEX_POINT('',#166); +#168=CARTESIAN_POINT('',(-9.,52.,5.)); +#169=DIRECTION('',(0.,0.,-1.)); +#170=DIRECTION('',(-1.,0.,0.)); +#171=AXIS2_PLACEMENT_3D('',#168,#169,#170); +#172=CIRCLE('',#171,1.75); +#173=EDGE_CURVE('',#167,#167,#172,.T.); +#174=ORIENTED_EDGE('',*,*,#173,.T.); +#175=EDGE_LOOP('',(#174)); +#176=FACE_BOUND('',#175,.T.); +#177=CARTESIAN_POINT('',(7.25,52.,5.)); +#178=VERTEX_POINT('',#177); +#179=CARTESIAN_POINT('',(9.,52.,5.)); +#180=DIRECTION('',(0.,0.,-1.)); +#181=DIRECTION('',(-1.,0.,0.)); +#182=AXIS2_PLACEMENT_3D('',#179,#180,#181); +#183=CIRCLE('',#182,1.75); +#184=EDGE_CURVE('',#178,#178,#183,.T.); +#185=ORIENTED_EDGE('',*,*,#184,.T.); +#186=EDGE_LOOP('',(#185)); +#187=FACE_BOUND('',#186,.T.); +#188=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#189=VERTEX_POINT('',#188); +#190=CARTESIAN_POINT('',(-17.,4.480500687,5.)); +#191=VERTEX_POINT('',#190); +#192=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#193=DIRECTION('',(0.,-1.,0.)); +#194=VECTOR('',#193,37.377752626); +#195=LINE('',#192,#194); +#196=EDGE_CURVE('',#189,#191,#195,.T.); +#197=ORIENTED_EDGE('',*,*,#196,.T.); +#198=CARTESIAN_POINT('',(17.,4.480500687,5.)); +#199=VERTEX_POINT('',#198); +#200=CARTESIAN_POINT('',(-17.,4.480500687,5.)); +#201=DIRECTION('',(1.,-0.,0.)); +#202=VECTOR('',#201,34.); +#203=LINE('',#200,#202); +#204=EDGE_CURVE('',#191,#199,#203,.T.); +#205=ORIENTED_EDGE('',*,*,#204,.T.); +#206=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#207=VERTEX_POINT('',#206); +#208=CARTESIAN_POINT('',(17.,4.480500687,5.)); +#209=DIRECTION('',(-0.,1.,-0.)); +#210=VECTOR('',#209,37.377752626); +#211=LINE('',#208,#210); +#212=EDGE_CURVE('',#199,#207,#211,.T.); +#213=ORIENTED_EDGE('',*,*,#212,.T.); +#214=CARTESIAN_POINT('',(23.5,41.858253313,5.)); +#215=VERTEX_POINT('',#214); +#216=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#217=DIRECTION('',(1.,-0.,0.)); +#218=VECTOR('',#217,6.5); +#219=LINE('',#216,#218); +#220=EDGE_CURVE('',#207,#215,#219,.T.); +#221=ORIENTED_EDGE('',*,*,#220,.T.); +#222=CARTESIAN_POINT('',(23.5,60.5,5.)); +#223=VERTEX_POINT('',#222); +#224=CARTESIAN_POINT('',(23.5,41.858253313,5.)); +#225=DIRECTION('',(-0.,1.,-0.)); +#226=VECTOR('',#225,18.641746687); +#227=LINE('',#224,#226); +#228=EDGE_CURVE('',#215,#223,#227,.T.); +#229=ORIENTED_EDGE('',*,*,#228,.T.); +#230=CARTESIAN_POINT('',(-23.5,60.5,5.)); +#231=VERTEX_POINT('',#230); +#232=CARTESIAN_POINT('',(23.5,60.5,5.)); +#233=DIRECTION('',(-1.,0.,-0.)); +#234=VECTOR('',#233,47.); +#235=LINE('',#232,#234); +#236=EDGE_CURVE('',#223,#231,#235,.T.); +#237=ORIENTED_EDGE('',*,*,#236,.T.); +#238=CARTESIAN_POINT('',(-23.5,41.858253313,5.)); +#239=VERTEX_POINT('',#238); +#240=CARTESIAN_POINT('',(-23.5,60.5,5.)); +#241=DIRECTION('',(0.,-1.,0.)); +#242=VECTOR('',#241,18.641746687); +#243=LINE('',#240,#242); +#244=EDGE_CURVE('',#231,#239,#243,.T.); +#245=ORIENTED_EDGE('',*,*,#244,.T.); +#246=CARTESIAN_POINT('',(-23.5,41.858253313,5.)); +#247=DIRECTION('',(1.,-0.,0.)); +#248=VECTOR('',#247,6.5); +#249=LINE('',#246,#248); +#250=EDGE_CURVE('',#239,#189,#249,.T.); +#251=ORIENTED_EDGE('',*,*,#250,.T.); +#252=EDGE_LOOP('',(#197,#205,#213,#221,#229,#237,#245,#251)); +#253=FACE_BOUND('',#252,.T.); +#254=ADVANCED_FACE('',(#176,#187,#253),#165,.T.); +#255=CARTESIAN_POINT('',(25.,62.,2.5)); +#256=DIRECTION('',(1.,0.,0.)); +#257=DIRECTION('',(0.,0.,-1.)); +#258=AXIS2_PLACEMENT_3D('',#255,#256,#257); +#259=PLANE('',#258); +#260=CARTESIAN_POINT('',(25.,5.485205765,26.166750919)); +#261=VERTEX_POINT('',#260); +#262=CARTESIAN_POINT('',(25.,-19.224694785,26.166750919)); +#263=VERTEX_POINT('',#262); +#264=CARTESIAN_POINT('',(25.,5.485205765,26.166750919)); +#265=DIRECTION('',(-0.,-1.,-0.)); +#266=VECTOR('',#265,24.70990055); +#267=LINE('',#264,#266); +#268=EDGE_CURVE('',#261,#263,#267,.T.); +#269=ORIENTED_EDGE('',*,*,#268,.T.); +#270=CARTESIAN_POINT('',(25.,-19.656977849,26.187562226)); +#271=VERTEX_POINT('',#270); +#272=CARTESIAN_POINT('',(25.,-19.224694785,30.666750919)); +#273=DIRECTION('',(-1.,-0.,-0.)); +#274=DIRECTION('',(0.,0.,-1.)); +#275=AXIS2_PLACEMENT_3D('',#272,#273,#274); +#276=CIRCLE('',#275,4.5); +#277=EDGE_CURVE('',#263,#271,#276,.T.); +#278=ORIENTED_EDGE('',*,*,#277,.T.); +#279=CARTESIAN_POINT('',(25.,3.4935706,3.577004957)); +#280=VERTEX_POINT('',#279); +#281=CARTESIAN_POINT('',(25.,3.4935706,3.577004957)); +#282=DIRECTION('',(0.,-0.715400991,0.69871412)); +#283=VECTOR('',#282,32.360240937); +#284=LINE('',#281,#283); +#285=EDGE_CURVE('',#280,#271,#284,.T.); +#286=ORIENTED_EDGE('',*,*,#285,.F.); +#287=CARTESIAN_POINT('',(25.,0.302940467,0.31017537)); +#288=VERTEX_POINT('',#287); +#289=CARTESIAN_POINT('',(25.,3.4935706,3.577004957)); +#290=DIRECTION('',(0.,-0.69871412,-0.715400991)); +#291=VECTOR('',#290,4.566431451); +#292=LINE('',#289,#291); +#293=EDGE_CURVE('',#280,#288,#292,.T.); +#294=ORIENTED_EDGE('',*,*,#293,.T.); +#295=CARTESIAN_POINT('',(25.,2.036591221,0.)); +#296=VERTEX_POINT('',#295); +#297=CARTESIAN_POINT('',(25.,2.036591221,5.)); +#298=DIRECTION('',(1.,0.,0.)); +#299=DIRECTION('',(0.,0.,-1.)); +#300=AXIS2_PLACEMENT_3D('',#297,#298,#299); +#301=CIRCLE('',#300,5.); +#302=EDGE_CURVE('',#288,#296,#301,.T.); +#303=ORIENTED_EDGE('',*,*,#302,.T.); +#304=CARTESIAN_POINT('',(25.,60.5,0.)); +#305=VERTEX_POINT('',#304); +#306=CARTESIAN_POINT('',(25.,60.5,0.)); +#307=DIRECTION('',(0.,-1.,0.)); +#308=VECTOR('',#307,58.463408779); +#309=LINE('',#306,#308); +#310=EDGE_CURVE('',#305,#296,#309,.T.); +#311=ORIENTED_EDGE('',*,*,#310,.F.); +#312=CARTESIAN_POINT('',(25.,60.5,3.5)); +#313=VERTEX_POINT('',#312); +#314=CARTESIAN_POINT('',(25.,60.5,0.)); +#315=DIRECTION('',(0.,0.,1.)); +#316=VECTOR('',#315,3.5); +#317=LINE('',#314,#316); +#318=EDGE_CURVE('',#305,#313,#317,.T.); +#319=ORIENTED_EDGE('',*,*,#318,.T.); +#320=CARTESIAN_POINT('',(25.,41.858253313,3.5)); +#321=VERTEX_POINT('',#320); +#322=CARTESIAN_POINT('',(25.,60.5,3.5)); +#323=DIRECTION('',(0.,-1.,0.)); +#324=VECTOR('',#323,18.641746687); +#325=LINE('',#322,#324); +#326=EDGE_CURVE('',#313,#321,#325,.T.); +#327=ORIENTED_EDGE('',*,*,#326,.T.); +#328=CARTESIAN_POINT('',(25.,22.492048716,11.911326208)); +#329=VERTEX_POINT('',#328); +#330=CARTESIAN_POINT('',(25.,41.858253313,30.)); +#331=DIRECTION('',(-1.,-0.,-0.)); +#332=DIRECTION('',(0.,0.,-1.)); +#333=AXIS2_PLACEMENT_3D('',#330,#331,#332); +#334=CIRCLE('',#333,26.5); +#335=EDGE_CURVE('',#321,#329,#334,.T.); +#336=ORIENTED_EDGE('',*,*,#335,.T.); +#337=CARTESIAN_POINT('',(25.,11.69700724,23.468778362)); +#338=VERTEX_POINT('',#337); +#339=CARTESIAN_POINT('',(25.,22.492048716,11.911326208)); +#340=DIRECTION('',(-0.,-0.682591464,0.730800173)); +#341=VECTOR('',#340,15.814791202); +#342=LINE('',#339,#341); +#343=EDGE_CURVE('',#329,#338,#342,.T.); +#344=ORIENTED_EDGE('',*,*,#343,.T.); +#345=CARTESIAN_POINT('',(25.,5.485205765,17.666750919)); +#346=DIRECTION('',(1.,0.,0.)); +#347=DIRECTION('',(0.,0.,-1.)); +#348=AXIS2_PLACEMENT_3D('',#345,#346,#347); +#349=CIRCLE('',#348,8.5); +#350=EDGE_CURVE('',#338,#261,#349,.T.); +#351=ORIENTED_EDGE('',*,*,#350,.T.); +#352=EDGE_LOOP('',(#269,#278,#286,#294,#303,#311,#319,#327,#336,#344,#351)); +#353=FACE_BOUND('',#352,.T.); +#354=ADVANCED_FACE('',(#353),#259,.T.); +#355=CARTESIAN_POINT('',(-25.,62.,2.5)); +#356=DIRECTION('',(-1.,0.,0.)); +#357=DIRECTION('',(0.,0.,1.)); +#358=AXIS2_PLACEMENT_3D('',#355,#356,#357); +#359=PLANE('',#358); +#360=CARTESIAN_POINT('',(-25.,-19.656977849,26.187562226)); +#361=VERTEX_POINT('',#360); +#362=CARTESIAN_POINT('',(-25.,3.4935706,3.577004957)); +#363=VERTEX_POINT('',#362); +#364=CARTESIAN_POINT('',(-25.,-19.656977849,26.187562226)); +#365=DIRECTION('',(0.,0.715400991,-0.69871412)); +#366=VECTOR('',#365,32.360240937); +#367=LINE('',#364,#366); +#368=EDGE_CURVE('',#361,#363,#367,.T.); +#369=ORIENTED_EDGE('',*,*,#368,.F.); +#370=CARTESIAN_POINT('',(-25.,-19.224694785,26.166750919)); +#371=VERTEX_POINT('',#370); +#372=CARTESIAN_POINT('',(-25.,-19.224694785,30.666750919)); +#373=DIRECTION('',(1.,-0.,-0.)); +#374=DIRECTION('',(0.,0.,1.)); +#375=AXIS2_PLACEMENT_3D('',#372,#373,#374); +#376=CIRCLE('',#375,4.5); +#377=EDGE_CURVE('',#361,#371,#376,.T.); +#378=ORIENTED_EDGE('',*,*,#377,.T.); +#379=CARTESIAN_POINT('',(-25.,5.485205765,26.166750919)); +#380=VERTEX_POINT('',#379); +#381=CARTESIAN_POINT('',(-25.,-19.224694785,26.166750919)); +#382=DIRECTION('',(0.,1.,0.)); +#383=VECTOR('',#382,24.70990055); +#384=LINE('',#381,#383); +#385=EDGE_CURVE('',#371,#380,#384,.T.); +#386=ORIENTED_EDGE('',*,*,#385,.T.); +#387=CARTESIAN_POINT('',(-25.,11.69700724,23.468778362)); +#388=VERTEX_POINT('',#387); +#389=CARTESIAN_POINT('',(-25.,5.485205765,17.666750919)); +#390=DIRECTION('',(-1.,0.,0.)); +#391=DIRECTION('',(0.,0.,1.)); +#392=AXIS2_PLACEMENT_3D('',#389,#390,#391); +#393=CIRCLE('',#392,8.5); +#394=EDGE_CURVE('',#380,#388,#393,.T.); +#395=ORIENTED_EDGE('',*,*,#394,.T.); +#396=CARTESIAN_POINT('',(-25.,22.492048716,11.911326208)); +#397=VERTEX_POINT('',#396); +#398=CARTESIAN_POINT('',(-25.,11.69700724,23.468778362)); +#399=DIRECTION('',(0.,0.682591464,-0.730800173)); +#400=VECTOR('',#399,15.814791202); +#401=LINE('',#398,#400); +#402=EDGE_CURVE('',#388,#397,#401,.T.); +#403=ORIENTED_EDGE('',*,*,#402,.T.); +#404=CARTESIAN_POINT('',(-25.,41.858253313,3.5)); +#405=VERTEX_POINT('',#404); +#406=CARTESIAN_POINT('',(-25.,41.858253313,30.)); +#407=DIRECTION('',(1.,-0.,-0.)); +#408=DIRECTION('',(0.,0.,1.)); +#409=AXIS2_PLACEMENT_3D('',#406,#407,#408); +#410=CIRCLE('',#409,26.5); +#411=EDGE_CURVE('',#397,#405,#410,.T.); +#412=ORIENTED_EDGE('',*,*,#411,.T.); +#413=CARTESIAN_POINT('',(-25.,60.5,3.5)); +#414=VERTEX_POINT('',#413); +#415=CARTESIAN_POINT('',(-25.,41.858253313,3.5)); +#416=DIRECTION('',(-0.,1.,-0.)); +#417=VECTOR('',#416,18.641746687); +#418=LINE('',#415,#417); +#419=EDGE_CURVE('',#405,#414,#418,.T.); +#420=ORIENTED_EDGE('',*,*,#419,.T.); +#421=CARTESIAN_POINT('',(-25.,60.5,0.)); +#422=VERTEX_POINT('',#421); +#423=CARTESIAN_POINT('',(-25.,60.5,3.5)); +#424=DIRECTION('',(0.,0.,-1.)); +#425=VECTOR('',#424,3.5); +#426=LINE('',#423,#425); +#427=EDGE_CURVE('',#414,#422,#426,.T.); +#428=ORIENTED_EDGE('',*,*,#427,.T.); +#429=CARTESIAN_POINT('',(-25.,2.036591221,0.)); +#430=VERTEX_POINT('',#429); +#431=CARTESIAN_POINT('',(-25.,60.5,0.)); +#432=DIRECTION('',(0.,-1.,0.)); +#433=VECTOR('',#432,58.463408779); +#434=LINE('',#431,#433); +#435=EDGE_CURVE('',#422,#430,#434,.T.); +#436=ORIENTED_EDGE('',*,*,#435,.T.); +#437=CARTESIAN_POINT('',(-25.,0.302940467,0.31017537)); +#438=VERTEX_POINT('',#437); +#439=CARTESIAN_POINT('',(-25.,2.036591221,5.)); +#440=DIRECTION('',(-1.,0.,0.)); +#441=DIRECTION('',(0.,0.,1.)); +#442=AXIS2_PLACEMENT_3D('',#439,#440,#441); +#443=CIRCLE('',#442,5.); +#444=EDGE_CURVE('',#430,#438,#443,.T.); +#445=ORIENTED_EDGE('',*,*,#444,.T.); +#446=CARTESIAN_POINT('',(-25.,3.4935706,3.577004957)); +#447=DIRECTION('',(0.,-0.69871412,-0.715400991)); +#448=VECTOR('',#447,4.566431451); +#449=LINE('',#446,#448); +#450=EDGE_CURVE('',#363,#438,#449,.T.); +#451=ORIENTED_EDGE('',*,*,#450,.F.); +#452=EDGE_LOOP('',(#369,#378,#386,#395,#403,#412,#420,#428,#436,#445,#451)); +#453=FACE_BOUND('',#452,.T.); +#454=ADVANCED_FACE('',(#453),#359,.T.); +#455=CARTESIAN_POINT('',(0.,62.,0.)); +#456=DIRECTION('',(0.,0.,1.)); +#457=DIRECTION('',(1.,0.,0.)); +#458=AXIS2_PLACEMENT_3D('',#455,#456,#457); +#459=PLANE('',#458); +#460=CARTESIAN_POINT('',(-10.75,52.,0.)); +#461=VERTEX_POINT('',#460); +#462=CARTESIAN_POINT('',(-9.,52.,0.)); +#463=DIRECTION('',(0.,0.,-1.)); +#464=DIRECTION('',(-1.,0.,0.)); +#465=AXIS2_PLACEMENT_3D('',#462,#463,#464); +#466=CIRCLE('',#465,1.75); +#467=EDGE_CURVE('',#461,#461,#466,.T.); +#468=ORIENTED_EDGE('',*,*,#467,.F.); +#469=EDGE_LOOP('',(#468)); +#470=FACE_BOUND('',#469,.T.); +#471=CARTESIAN_POINT('',(7.25,52.,0.)); +#472=VERTEX_POINT('',#471); +#473=CARTESIAN_POINT('',(9.,52.,0.)); +#474=DIRECTION('',(0.,0.,-1.)); +#475=DIRECTION('',(-1.,0.,0.)); +#476=AXIS2_PLACEMENT_3D('',#473,#474,#475); +#477=CIRCLE('',#476,1.75); +#478=EDGE_CURVE('',#472,#472,#477,.T.); +#479=ORIENTED_EDGE('',*,*,#478,.F.); +#480=EDGE_LOOP('',(#479)); +#481=FACE_BOUND('',#480,.T.); +#482=ORIENTED_EDGE('',*,*,#435,.F.); +#483=CARTESIAN_POINT('',(-23.5,62.,0.)); +#484=VERTEX_POINT('',#483); +#485=CARTESIAN_POINT('',(-23.5,60.5,0.)); +#486=DIRECTION('',(-0.,-0.,-1.)); +#487=DIRECTION('',(1.,0.,-0.)); +#488=AXIS2_PLACEMENT_3D('',#485,#486,#487); +#489=CIRCLE('',#488,1.5); +#490=EDGE_CURVE('',#422,#484,#489,.T.); +#491=ORIENTED_EDGE('',*,*,#490,.T.); +#492=CARTESIAN_POINT('',(23.5,62.,0.)); +#493=VERTEX_POINT('',#492); +#494=CARTESIAN_POINT('',(23.5,62.,0.)); +#495=DIRECTION('',(-1.,-0.,0.)); +#496=VECTOR('',#495,47.); +#497=LINE('',#494,#496); +#498=EDGE_CURVE('',#493,#484,#497,.T.); +#499=ORIENTED_EDGE('',*,*,#498,.F.); +#500=CARTESIAN_POINT('',(23.5,60.5,0.)); +#501=DIRECTION('',(-0.,-0.,-1.)); +#502=DIRECTION('',(1.,0.,-0.)); +#503=AXIS2_PLACEMENT_3D('',#500,#501,#502); +#504=CIRCLE('',#503,1.5); +#505=EDGE_CURVE('',#493,#305,#504,.T.); +#506=ORIENTED_EDGE('',*,*,#505,.T.); +#507=ORIENTED_EDGE('',*,*,#310,.T.); +#508=CARTESIAN_POINT('',(25.,2.036591221,0.)); +#509=DIRECTION('',(-1.,0.,0.)); +#510=VECTOR('',#509,50.); +#511=LINE('',#508,#510); +#512=EDGE_CURVE('',#296,#430,#511,.T.); +#513=ORIENTED_EDGE('',*,*,#512,.T.); +#514=EDGE_LOOP('',(#482,#491,#499,#506,#507,#513)); +#515=FACE_BOUND('',#514,.T.); +#516=ADVANCED_FACE('',(#470,#481,#515),#459,.F.); +#517=CARTESIAN_POINT('',(0.,62.,0.)); +#518=DIRECTION('',(0.,-1.,0.)); +#519=DIRECTION('',(0.,0.,-1.)); +#520=AXIS2_PLACEMENT_3D('',#517,#518,#519); +#521=PLANE('',#520); +#522=ORIENTED_EDGE('',*,*,#498,.T.); +#523=CARTESIAN_POINT('',(-23.5,62.,3.5)); +#524=VERTEX_POINT('',#523); +#525=CARTESIAN_POINT('',(-23.5,62.,-0.)); +#526=DIRECTION('',(-0.,-0.,1.)); +#527=VECTOR('',#526,3.5); +#528=LINE('',#525,#527); +#529=EDGE_CURVE('',#484,#524,#528,.T.); +#530=ORIENTED_EDGE('',*,*,#529,.T.); +#531=CARTESIAN_POINT('',(23.5,62.,3.5)); +#532=VERTEX_POINT('',#531); +#533=CARTESIAN_POINT('',(-23.5,62.,3.5)); +#534=DIRECTION('',(1.,-0.,0.)); +#535=VECTOR('',#534,47.); +#536=LINE('',#533,#535); +#537=EDGE_CURVE('',#524,#532,#536,.T.); +#538=ORIENTED_EDGE('',*,*,#537,.T.); +#539=CARTESIAN_POINT('',(23.5,62.,3.5)); +#540=DIRECTION('',(-0.,-0.,-1.)); +#541=VECTOR('',#540,3.5); +#542=LINE('',#539,#541); +#543=EDGE_CURVE('',#532,#493,#542,.T.); +#544=ORIENTED_EDGE('',*,*,#543,.T.); +#545=EDGE_LOOP('',(#522,#530,#538,#544)); +#546=FACE_BOUND('',#545,.T.); +#547=ADVANCED_FACE('',(#546),#521,.F.); +#548=CARTESIAN_POINT('',(9.,52.,5.)); +#549=DIRECTION('',(0.,0.,-1.)); +#550=DIRECTION('',(-1.,0.,0.)); +#551=AXIS2_PLACEMENT_3D('',#548,#549,#550); +#552=CYLINDRICAL_SURFACE('',#551,1.75); +#553=CARTESIAN_POINT('',(7.25,52.,0.)); +#554=DIRECTION('',(-0.,-0.,1.)); +#555=VECTOR('',#554,5.); +#556=LINE('',#553,#555); +#557=EDGE_CURVE('',#472,#178,#556,.T.); +#558=ORIENTED_EDGE('',*,*,#557,.F.); +#559=ORIENTED_EDGE('',*,*,#478,.T.); +#560=ORIENTED_EDGE('',*,*,#557,.T.); +#561=ORIENTED_EDGE('',*,*,#184,.F.); +#562=EDGE_LOOP('',(#558,#559,#560,#561)); +#563=FACE_BOUND('',#562,.T.); +#564=ADVANCED_FACE('',(#563),#552,.F.); +#565=CARTESIAN_POINT('',(-9.,52.,5.)); +#566=DIRECTION('',(0.,0.,-1.)); +#567=DIRECTION('',(-1.,0.,0.)); +#568=AXIS2_PLACEMENT_3D('',#565,#566,#567); +#569=CYLINDRICAL_SURFACE('',#568,1.75); +#570=CARTESIAN_POINT('',(-10.75,52.,0.)); +#571=DIRECTION('',(-0.,-0.,1.)); +#572=VECTOR('',#571,5.); +#573=LINE('',#570,#572); +#574=EDGE_CURVE('',#461,#167,#573,.T.); +#575=ORIENTED_EDGE('',*,*,#574,.F.); +#576=ORIENTED_EDGE('',*,*,#467,.T.); +#577=ORIENTED_EDGE('',*,*,#574,.T.); +#578=ORIENTED_EDGE('',*,*,#173,.F.); +#579=EDGE_LOOP('',(#575,#576,#577,#578)); +#580=FACE_BOUND('',#579,.T.); +#581=ADVANCED_FACE('',(#580),#569,.F.); +#582=CARTESIAN_POINT('',(0.,3.4935706,3.577004957)); +#583=DIRECTION('',(0.,0.69871412,0.715400991)); +#584=DIRECTION('',(-1.,0.,0.)); +#585=AXIS2_PLACEMENT_3D('',#582,#583,#584); +#586=PLANE('',#585); +#587=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338)); +#588=VERTEX_POINT('',#587); +#589=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338)); +#590=DIRECTION('',(-0.226031883,0.696886345,-0.680631332)); +#591=VECTOR('',#590,34.686653825); +#592=LINE('',#589,#591); +#593=EDGE_CURVE('',#588,#280,#592,.T.); +#594=ORIENTED_EDGE('',*,*,#593,.T.); +#595=ORIENTED_EDGE('',*,*,#285,.T.); +#596=CARTESIAN_POINT('',(24.811794461,-20.679084811,27.185828338)); +#597=VERTEX_POINT('',#596); +#598=CARTESIAN_POINT('',(25.,-19.656977849,26.187562226)); +#599=CARTESIAN_POINT('',(25.,-20.003592331,26.526091855)); +#600=CARTESIAN_POINT('',(24.90831093,-20.341566038,26.856182258)); +#601=CARTESIAN_POINT('',(24.811794461,-20.679084811,27.185828338)); +#602=B_SPLINE_CURVE_WITH_KNOTS('',3,(#598,#599,#600,#601),.UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.001441062),.UNSPECIFIED.); +#603=EDGE_CURVE('',#271,#597,#602,.T.); +#604=ORIENTED_EDGE('',*,*,#603,.T.); +#605=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338)); +#606=DIRECTION('',(-1.,0.,0.)); +#607=VECTOR('',#606,8.028495235); +#608=LINE('',#605,#607); +#609=EDGE_CURVE('',#588,#597,#608,.T.); +#610=ORIENTED_EDGE('',*,*,#609,.F.); +#611=EDGE_LOOP('',(#594,#595,#604,#610)); +#612=FACE_BOUND('',#611,.T.); +#613=ADVANCED_FACE('',(#612),#586,.T.); +#614=CARTESIAN_POINT('',(0.,3.4935706,3.577004957)); +#615=DIRECTION('',(0.,0.69871412,0.715400991)); +#616=DIRECTION('',(-1.,0.,0.)); +#617=AXIS2_PLACEMENT_3D('',#614,#615,#616); +#618=PLANE('',#617); +#619=CARTESIAN_POINT('',(17.,-20.679084811,27.185828338)); +#620=VERTEX_POINT('',#619); +#621=CARTESIAN_POINT('',(17.,0.288215967,6.707594051)); +#622=VERTEX_POINT('',#621); +#623=CARTESIAN_POINT('',(17.,-20.679084811,27.185828338)); +#624=DIRECTION('',(-0.,0.715400991,-0.69871412)); +#625=VECTOR('',#624,29.308459212); +#626=LINE('',#623,#625); +#627=EDGE_CURVE('',#620,#622,#626,.T.); +#628=ORIENTED_EDGE('',*,*,#627,.T.); +#629=CARTESIAN_POINT('',(-17.,0.288215967,6.707594051)); +#630=VERTEX_POINT('',#629); +#631=CARTESIAN_POINT('',(17.,0.288215967,6.707594051)); +#632=DIRECTION('',(-1.,0.,-0.)); +#633=VECTOR('',#632,34.); +#634=LINE('',#631,#633); +#635=EDGE_CURVE('',#622,#630,#634,.T.); +#636=ORIENTED_EDGE('',*,*,#635,.T.); +#637=CARTESIAN_POINT('',(-17.,-20.679084811,27.185828338)); +#638=VERTEX_POINT('',#637); +#639=CARTESIAN_POINT('',(-17.,0.288215967,6.707594051)); +#640=DIRECTION('',(-0.,-0.715400991,0.69871412)); +#641=VECTOR('',#640,29.308459212); +#642=LINE('',#639,#641); +#643=EDGE_CURVE('',#630,#638,#642,.T.); +#644=ORIENTED_EDGE('',*,*,#643,.T.); +#645=CARTESIAN_POINT('',(17.,-20.679084811,27.185828338)); +#646=DIRECTION('',(-1.,0.,0.)); +#647=VECTOR('',#646,34.); +#648=LINE('',#645,#647); +#649=EDGE_CURVE('',#620,#638,#648,.T.); +#650=ORIENTED_EDGE('',*,*,#649,.F.); +#651=EDGE_LOOP('',(#628,#636,#644,#650)); +#652=FACE_BOUND('',#651,.T.); +#653=ADVANCED_FACE('',(#652),#618,.T.); +#654=CARTESIAN_POINT('',(20.,-5.67149291,27.666750919)); +#655=DIRECTION('',(0.,0.,-1.)); +#656=DIRECTION('',(-1.,0.,0.)); +#657=AXIS2_PLACEMENT_3D('',#654,#655,#656); +#658=PLANE('',#657); +#659=CARTESIAN_POINT('',(23.5,5.485205765,27.666750919)); +#660=VERTEX_POINT('',#659); +#661=CARTESIAN_POINT('',(21.,5.485205765,27.666750919)); +#662=VERTEX_POINT('',#661); +#663=CARTESIAN_POINT('',(23.5,5.485205765,27.666750919)); +#664=DIRECTION('',(-1.,-0.,0.)); +#665=VECTOR('',#664,2.5); +#666=LINE('',#663,#665); +#667=EDGE_CURVE('',#660,#662,#666,.T.); +#668=ORIENTED_EDGE('',*,*,#667,.T.); +#669=CARTESIAN_POINT('',(21.,-15.854009142,27.666750919)); +#670=VERTEX_POINT('',#669); +#671=CARTESIAN_POINT('',(21.,5.485205765,27.666750919)); +#672=DIRECTION('',(-0.,-1.,-0.)); +#673=VECTOR('',#672,21.339214907); +#674=LINE('',#671,#673); +#675=EDGE_CURVE('',#662,#670,#674,.T.); +#676=ORIENTED_EDGE('',*,*,#675,.T.); +#677=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919)); +#678=VERTEX_POINT('',#677); +#679=CARTESIAN_POINT('',(17.,-15.854009142,27.666750919)); +#680=DIRECTION('',(0.,0.,-1.)); +#681=DIRECTION('',(0.,-1.,0.)); +#682=AXIS2_PLACEMENT_3D('',#679,#680,#681); +#683=ELLIPSE('',#682,5.724802012,4.); +#684=EDGE_CURVE('',#670,#678,#683,.T.); +#685=ORIENTED_EDGE('',*,*,#684,.T.); +#686=CARTESIAN_POINT('',(23.5,-19.224694785,27.666750919)); +#687=VERTEX_POINT('',#686); +#688=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919)); +#689=DIRECTION('',(1.,-0.,-0.)); +#690=VECTOR('',#689,3.266845356); +#691=LINE('',#688,#690); +#692=EDGE_CURVE('',#678,#687,#691,.T.); +#693=ORIENTED_EDGE('',*,*,#692,.T.); +#694=CARTESIAN_POINT('',(23.5,-19.224694785,27.666750919)); +#695=DIRECTION('',(0.,1.,0.)); +#696=VECTOR('',#695,24.70990055); +#697=LINE('',#694,#696); +#698=EDGE_CURVE('',#687,#660,#697,.T.); +#699=ORIENTED_EDGE('',*,*,#698,.T.); +#700=EDGE_LOOP('',(#668,#676,#685,#693,#699)); +#701=FACE_BOUND('',#700,.T.); +#702=ADVANCED_FACE('',(#701),#658,.F.); +#703=CARTESIAN_POINT('',(20.,20.414253545,16.33337546)); +#704=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#705=DIRECTION('',(0.,0.682591464,-0.730800173)); +#706=AXIS2_PLACEMENT_3D('',#703,#704,#705); +#707=PLANE('',#706); +#708=CARTESIAN_POINT('',(23.5,23.588248977,12.935213404)); +#709=VERTEX_POINT('',#708); +#710=CARTESIAN_POINT('',(21.,23.588248977,12.935213404)); +#711=VERTEX_POINT('',#710); +#712=CARTESIAN_POINT('',(23.5,23.588248977,12.935213404)); +#713=DIRECTION('',(-1.,0.,-0.)); +#714=VECTOR('',#713,2.5); +#715=LINE('',#712,#714); +#716=EDGE_CURVE('',#709,#711,#715,.T.); +#717=ORIENTED_EDGE('',*,*,#716,.T.); +#718=CARTESIAN_POINT('',(21.,12.7932075,24.492665558)); +#719=VERTEX_POINT('',#718); +#720=CARTESIAN_POINT('',(21.,23.588248977,12.935213404)); +#721=DIRECTION('',(-0.,-0.682591464,0.730800173)); +#722=VECTOR('',#721,15.814791202); +#723=LINE('',#720,#722); +#724=EDGE_CURVE('',#711,#719,#723,.T.); +#725=ORIENTED_EDGE('',*,*,#724,.T.); +#726=CARTESIAN_POINT('',(23.5,12.7932075,24.492665558)); +#727=VERTEX_POINT('',#726); +#728=CARTESIAN_POINT('',(21.,12.7932075,24.492665558)); +#729=DIRECTION('',(1.,0.,-0.)); +#730=VECTOR('',#729,2.5); +#731=LINE('',#728,#730); +#732=EDGE_CURVE('',#719,#727,#731,.T.); +#733=ORIENTED_EDGE('',*,*,#732,.T.); +#734=CARTESIAN_POINT('',(23.5,12.7932075,24.492665558)); +#735=DIRECTION('',(0.,0.682591464,-0.730800173)); +#736=VECTOR('',#735,15.814791202); +#737=LINE('',#734,#736); +#738=EDGE_CURVE('',#727,#709,#737,.T.); +#739=ORIENTED_EDGE('',*,*,#738,.T.); +#740=EDGE_LOOP('',(#717,#725,#733,#739)); +#741=FACE_BOUND('',#740,.T.); +#742=ADVANCED_FACE('',(#741),#707,.F.); +#743=CARTESIAN_POINT('',(0.,-8.334936491,5.805136271)); +#744=DIRECTION('',(0.,-0.866025404,-0.5)); +#745=DIRECTION('',(0.,0.5,-0.866025404)); +#746=AXIS2_PLACEMENT_3D('',#743,#744,#745); +#747=PLANE('',#746); +#748=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338)); +#749=VERTEX_POINT('',#748); +#750=CARTESIAN_POINT('',(-33.395273411,-20.679084811,27.185828338)); +#751=VERTEX_POINT('',#750); +#752=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338)); +#753=DIRECTION('',(-1.,0.,0.)); +#754=VECTOR('',#753,8.58347895); +#755=LINE('',#752,#754); +#756=EDGE_CURVE('',#749,#751,#755,.T.); +#757=ORIENTED_EDGE('',*,*,#756,.T.); +#758=CARTESIAN_POINT('',(-34.586164628,-21.134936491,27.975386608)); +#759=VERTEX_POINT('',#758); +#760=CARTESIAN_POINT('',(-33.395273411,-20.679084811,27.185828338)); +#761=CARTESIAN_POINT('',(-33.757257255,-20.85386422,27.488555154)); +#762=CARTESIAN_POINT('',(-34.169740667,-20.9956887,27.734202361)); +#763=CARTESIAN_POINT('',(-34.586164628,-21.134936491,27.975386608)); +#764=B_SPLINE_CURVE_WITH_KNOTS('',3,(#760,#761,#762,#763),.UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.001499808),.UNSPECIFIED.); +#765=EDGE_CURVE('',#751,#759,#764,.T.); +#766=ORIENTED_EDGE('',*,*,#765,.T.); +#767=CARTESIAN_POINT('',(-35.4,-21.134936491,27.975386608)); +#768=VERTEX_POINT('',#767); +#769=CARTESIAN_POINT('',(-34.586164628,-21.134936491,27.975386608)); +#770=DIRECTION('',(-1.,-0.,0.)); +#771=VECTOR('',#770,0.813835372); +#772=LINE('',#769,#771); +#773=EDGE_CURVE('',#759,#768,#772,.T.); +#774=ORIENTED_EDGE('',*,*,#773,.T.); +#775=CARTESIAN_POINT('',(-35.4,-29.334936491,42.17820323)); +#776=VERTEX_POINT('',#775); +#777=CARTESIAN_POINT('',(-35.4,-21.134936491,27.975386608)); +#778=DIRECTION('',(0.,-0.5,0.866025404)); +#779=VECTOR('',#778,16.4); +#780=LINE('',#777,#779); +#781=EDGE_CURVE('',#768,#776,#780,.T.); +#782=ORIENTED_EDGE('',*,*,#781,.T.); +#783=CARTESIAN_POINT('',(33.,-29.334936491,42.17820323)); +#784=VERTEX_POINT('',#783); +#785=CARTESIAN_POINT('',(-35.4,-29.334936491,42.17820323)); +#786=DIRECTION('',(1.,0.,-0.)); +#787=VECTOR('',#786,68.4); +#788=LINE('',#785,#787); +#789=EDGE_CURVE('',#776,#784,#788,.T.); +#790=ORIENTED_EDGE('',*,*,#789,.T.); +#791=CARTESIAN_POINT('',(33.,-20.334936491,26.589745962)); +#792=VERTEX_POINT('',#791); +#793=CARTESIAN_POINT('',(33.,-29.334936491,42.17820323)); +#794=DIRECTION('',(0.,0.5,-0.866025404)); +#795=VECTOR('',#794,18.); +#796=LINE('',#793,#795); +#797=EDGE_CURVE('',#784,#792,#796,.T.); +#798=ORIENTED_EDGE('',*,*,#797,.T.); +#799=CARTESIAN_POINT('',(32.686519869,-20.334936491,26.589745962)); +#800=VERTEX_POINT('',#799); +#801=CARTESIAN_POINT('',(32.686519869,-20.334936491,26.589745962)); +#802=DIRECTION('',(1.,0.,-0.)); +#803=VECTOR('',#802,0.313480131); +#804=LINE('',#801,#803); +#805=EDGE_CURVE('',#800,#792,#804,.T.); +#806=ORIENTED_EDGE('',*,*,#805,.F.); +#807=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338)); +#808=DIRECTION('',(-0.218031559,0.48797086,-0.845190321)); +#809=VECTOR('',#808,0.705264082); +#810=LINE('',#807,#809); +#811=EDGE_CURVE('',#588,#800,#810,.T.); +#812=ORIENTED_EDGE('',*,*,#811,.F.); +#813=ORIENTED_EDGE('',*,*,#609,.T.); +#814=CARTESIAN_POINT('',(23.5,-21.822770996,29.166750919)); +#815=VERTEX_POINT('',#814); +#816=CARTESIAN_POINT('',(24.811794461,-20.679084811,27.185828338)); +#817=CARTESIAN_POINT('',(24.66960432,-20.890528388,27.552059357)); +#818=CARTESIAN_POINT('',(24.467359226,-21.085639936,27.890002471)); +#819=CARTESIAN_POINT('',(24.239042023,-21.273661136,28.215664742)); +#820=CARTESIAN_POINT('',(24.01072482,-21.461682336,28.541327013)); +#821=CARTESIAN_POINT('',(23.755146792,-21.642354388,28.854260188)); +#822=CARTESIAN_POINT('',(23.5,-21.822770996,29.166750919)); +#823=B_SPLINE_CURVE_WITH_KNOTS('',3,(#816,#817,#818,#819,#820,#821,#822),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.001318294,0.002636589),.UNSPECIFIED.); +#824=EDGE_CURVE('',#597,#815,#823,.T.); +#825=ORIENTED_EDGE('',*,*,#824,.T.); +#826=CARTESIAN_POINT('',(19.193758872,-21.822770996,29.166750919)); +#827=VERTEX_POINT('',#826); +#828=CARTESIAN_POINT('',(23.5,-21.822770996,29.166750919)); +#829=DIRECTION('',(-1.,0.,0.)); +#830=VECTOR('',#829,4.306241128); +#831=LINE('',#828,#830); +#832=EDGE_CURVE('',#815,#827,#831,.T.); +#833=ORIENTED_EDGE('',*,*,#832,.T.); +#834=CARTESIAN_POINT('',(18.461328155,-21.382229488,28.403710644)); +#835=VERTEX_POINT('',#834); +#836=CARTESIAN_POINT('',(19.193758872,-21.822770996,29.166750919)); +#837=CARTESIAN_POINT('',(19.046023901,-21.760487506,29.058872755)); +#838=CARTESIAN_POINT('',(18.903865491,-21.694218246,28.944091025)); +#839=CARTESIAN_POINT('',(18.778712218,-21.621396065,28.817959308)); +#840=CARTESIAN_POINT('',(18.653558945,-21.548573884,28.69182759)); +#841=CARTESIAN_POINT('',(18.545899074,-21.469516502,28.554896187)); +#842=CARTESIAN_POINT('',(18.461328155,-21.382229488,28.403710644)); +#843=B_SPLINE_CURVE_WITH_KNOTS('',3,(#836,#837,#838,#839,#840,#841,#842),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.00057373,0.00114746),.UNSPECIFIED.); +#844=EDGE_CURVE('',#827,#835,#843,.T.); +#845=ORIENTED_EDGE('',*,*,#844,.T.); +#846=CARTESIAN_POINT('',(17.,-26.230561625,36.801268237)); +#847=DIRECTION('',(-0.,0.866025404,0.5)); +#848=DIRECTION('',(0.,-0.5,0.866025404)); +#849=AXIS2_PLACEMENT_3D('',#846,#847,#848); +#850=ELLIPSE('',#849,11.102953628,3.); +#851=EDGE_CURVE('',#835,#620,#850,.T.); +#852=ORIENTED_EDGE('',*,*,#851,.T.); +#853=ORIENTED_EDGE('',*,*,#649,.T.); +#854=CARTESIAN_POINT('',(-18.461328155,-21.382229488,28.403710644)); +#855=VERTEX_POINT('',#854); +#856=CARTESIAN_POINT('',(-17.,-26.230561625,36.801268237)); +#857=DIRECTION('',(-0.,0.866025404,0.5)); +#858=DIRECTION('',(0.,0.5,-0.866025404)); +#859=AXIS2_PLACEMENT_3D('',#856,#857,#858); +#860=ELLIPSE('',#859,11.102953628,3.); +#861=EDGE_CURVE('',#638,#855,#860,.T.); +#862=ORIENTED_EDGE('',*,*,#861,.T.); +#863=CARTESIAN_POINT('',(-19.193758872,-21.822770996,29.166750919)); +#864=VERTEX_POINT('',#863); +#865=CARTESIAN_POINT('',(-18.461328155,-21.382229488,28.403710644)); +#866=CARTESIAN_POINT('',(-18.545900321,-21.469517789,28.554898417)); +#867=CARTESIAN_POINT('',(-18.6535603,-21.548574689,28.691828983)); +#868=CARTESIAN_POINT('',(-18.778711358,-21.621395565,28.817958441)); +#869=CARTESIAN_POINT('',(-18.903862416,-21.694216441,28.944087898)); +#870=CARTESIAN_POINT('',(-19.046022775,-21.760487034,29.058871932)); +#871=CARTESIAN_POINT('',(-19.193758872,-21.822770996,29.166750919)); +#872=B_SPLINE_CURVE_WITH_KNOTS('',3,(#865,#866,#867,#868,#869,#870,#871),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.000573726,0.001147452),.UNSPECIFIED.); +#873=EDGE_CURVE('',#855,#864,#872,.T.); +#874=ORIENTED_EDGE('',*,*,#873,.T.); +#875=CARTESIAN_POINT('',(-23.5,-21.822770996,29.166750919)); +#876=VERTEX_POINT('',#875); +#877=CARTESIAN_POINT('',(-19.193758872,-21.822770996,29.166750919)); +#878=DIRECTION('',(-1.,0.,0.)); +#879=VECTOR('',#878,4.306241128); +#880=LINE('',#877,#879); +#881=EDGE_CURVE('',#864,#876,#880,.T.); +#882=ORIENTED_EDGE('',*,*,#881,.T.); +#883=CARTESIAN_POINT('',(-23.5,-21.822770996,29.166750919)); +#884=CARTESIAN_POINT('',(-23.755146792,-21.642354388,28.854260188)); +#885=CARTESIAN_POINT('',(-24.01072482,-21.461682336,28.541327013)); +#886=CARTESIAN_POINT('',(-24.239042023,-21.273661136,28.215664742)); +#887=CARTESIAN_POINT('',(-24.467359226,-21.085639936,27.890002471)); +#888=CARTESIAN_POINT('',(-24.66960432,-20.890528388,27.552059357)); +#889=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338)); +#890=B_SPLINE_CURVE_WITH_KNOTS('',3,(#883,#884,#885,#886,#887,#888,#889),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.001318294,0.002636589),.UNSPECIFIED.); +#891=EDGE_CURVE('',#876,#749,#890,.T.); +#892=ORIENTED_EDGE('',*,*,#891,.T.); +#893=EDGE_LOOP('',(#757,#766,#774,#782,#790,#798,#806,#812,#813,#825,#833,#845,#852,#853,#862,#874,#882,#892)); +#894=FACE_BOUND('',#893,.T.); +#895=CARTESIAN_POINT('',(22.5,-24.459936491,33.734455543)); +#896=VERTEX_POINT('',#895); +#897=CARTESIAN_POINT('',(22.5,-25.334936491,35.25)); +#898=DIRECTION('',(-0.,0.866025404,0.5)); +#899=DIRECTION('',(0.,0.5,-0.866025404)); +#900=AXIS2_PLACEMENT_3D('',#897,#898,#899); +#901=CIRCLE('',#900,1.75); +#902=EDGE_CURVE('',#896,#896,#901,.T.); +#903=ORIENTED_EDGE('',*,*,#902,.F.); +#904=EDGE_LOOP('',(#903)); +#905=FACE_BOUND('',#904,.T.); +#906=CARTESIAN_POINT('',(-22.5,-24.459936491,33.734455543)); +#907=VERTEX_POINT('',#906); +#908=CARTESIAN_POINT('',(-22.5,-25.334936491,35.25)); +#909=DIRECTION('',(-0.,0.866025404,0.5)); +#910=DIRECTION('',(0.,0.5,-0.866025404)); +#911=AXIS2_PLACEMENT_3D('',#908,#909,#910); +#912=CIRCLE('',#911,1.75); +#913=EDGE_CURVE('',#907,#907,#912,.T.); +#914=ORIENTED_EDGE('',*,*,#913,.F.); +#915=EDGE_LOOP('',(#914)); +#916=FACE_BOUND('',#915,.T.); +#917=ADVANCED_FACE('',(#894,#905,#916),#747,.F.); +#918=CARTESIAN_POINT('',(0.,3.4935706,3.577004957)); +#919=DIRECTION('',(0.,0.69871412,0.715400991)); +#920=DIRECTION('',(-1.,0.,0.)); +#921=AXIS2_PLACEMENT_3D('',#918,#919,#920); +#922=PLANE('',#921); +#923=ORIENTED_EDGE('',*,*,#756,.F.); +#924=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338)); +#925=CARTESIAN_POINT('',(-24.90831093,-20.341566038,26.856182258)); +#926=CARTESIAN_POINT('',(-25.,-20.003592331,26.526091855)); +#927=CARTESIAN_POINT('',(-25.,-19.656977849,26.187562226)); +#928=B_SPLINE_CURVE_WITH_KNOTS('',3,(#924,#925,#926,#927),.UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.001441062),.UNSPECIFIED.); +#929=EDGE_CURVE('',#749,#361,#928,.T.); +#930=ORIENTED_EDGE('',*,*,#929,.T.); +#931=ORIENTED_EDGE('',*,*,#368,.T.); +#932=CARTESIAN_POINT('',(-32.549112713,-19.781347462,26.309030893)); +#933=VERTEX_POINT('',#932); +#934=CARTESIAN_POINT('',(-32.549112713,-19.781347462,26.309030893)); +#935=DIRECTION('',(0.226031883,0.696886345,-0.680631332)); +#936=VECTOR('',#935,33.398441831); +#937=LINE('',#934,#936); +#938=EDGE_CURVE('',#933,#363,#937,.T.); +#939=ORIENTED_EDGE('',*,*,#938,.F.); +#940=CARTESIAN_POINT('',(-32.549112713,-19.781347462,26.309030893)); +#941=CARTESIAN_POINT('',(-32.608027878,-19.96299075,26.486437314)); +#942=CARTESIAN_POINT('',(-32.714167354,-20.129119138,26.648690725)); +#943=CARTESIAN_POINT('',(-32.860356046,-20.282089905,26.798093418)); +#944=CARTESIAN_POINT('',(-32.933450393,-20.358575289,26.872794765)); +#945=CARTESIAN_POINT('',(-33.015793095,-20.43040907,26.942953009)); +#946=CARTESIAN_POINT('',(-33.105059959,-20.496528912,27.007530592)); +#947=CARTESIAN_POINT('',(-33.194326823,-20.562648754,27.072108175)); +#948=CARTESIAN_POINT('',(-33.290956957,-20.623576649,27.131614915)); +#949=CARTESIAN_POINT('',(-33.395273411,-20.679084811,27.185828338)); +#950=B_SPLINE_CURVE_WITH_KNOTS('',3,(#940,#941,#942,#943,#944,#945,#946,#947,#948,#949),.UNSPECIFIED.,.F.,.F.,(4,3,3,4),(0.,0.000765971,0.001148957,0.001531942),.UNSPECIFIED.); +#951=EDGE_CURVE('',#933,#751,#950,.T.); +#952=ORIENTED_EDGE('',*,*,#951,.T.); +#953=EDGE_LOOP('',(#923,#930,#931,#939,#952)); +#954=FACE_BOUND('',#953,.T.); +#955=ADVANCED_FACE('',(#954),#922,.T.); +#956=CARTESIAN_POINT('',(-20.,-5.67149291,27.666750919)); +#957=DIRECTION('',(0.,0.,-1.)); +#958=DIRECTION('',(1.,0.,0.)); +#959=AXIS2_PLACEMENT_3D('',#956,#957,#958); +#960=PLANE('',#959); +#961=CARTESIAN_POINT('',(-20.233154644,-19.224694785,27.666750919)); +#962=VERTEX_POINT('',#961); +#963=CARTESIAN_POINT('',(-21.,-15.854009142,27.666750919)); +#964=VERTEX_POINT('',#963); +#965=CARTESIAN_POINT('',(-17.,-15.854009142,27.666750919)); +#966=DIRECTION('',(0.,0.,-1.)); +#967=DIRECTION('',(0.,1.,0.)); +#968=AXIS2_PLACEMENT_3D('',#965,#966,#967); +#969=ELLIPSE('',#968,5.724802012,4.); +#970=EDGE_CURVE('',#962,#964,#969,.T.); +#971=ORIENTED_EDGE('',*,*,#970,.T.); +#972=CARTESIAN_POINT('',(-21.,5.485205765,27.666750919)); +#973=VERTEX_POINT('',#972); +#974=CARTESIAN_POINT('',(-21.,-15.854009142,27.666750919)); +#975=DIRECTION('',(0.,1.,0.)); +#976=VECTOR('',#975,21.339214907); +#977=LINE('',#974,#976); +#978=EDGE_CURVE('',#964,#973,#977,.T.); +#979=ORIENTED_EDGE('',*,*,#978,.T.); +#980=CARTESIAN_POINT('',(-23.5,5.485205765,27.666750919)); +#981=VERTEX_POINT('',#980); +#982=CARTESIAN_POINT('',(-21.,5.485205765,27.666750919)); +#983=DIRECTION('',(-1.,0.,0.)); +#984=VECTOR('',#983,2.5); +#985=LINE('',#982,#984); +#986=EDGE_CURVE('',#973,#981,#985,.T.); +#987=ORIENTED_EDGE('',*,*,#986,.T.); +#988=CARTESIAN_POINT('',(-23.5,-19.224694785,27.666750919)); +#989=VERTEX_POINT('',#988); +#990=CARTESIAN_POINT('',(-23.5,5.485205765,27.666750919)); +#991=DIRECTION('',(-0.,-1.,-0.)); +#992=VECTOR('',#991,24.70990055); +#993=LINE('',#990,#992); +#994=EDGE_CURVE('',#981,#989,#993,.T.); +#995=ORIENTED_EDGE('',*,*,#994,.T.); +#996=CARTESIAN_POINT('',(-23.5,-19.224694785,27.666750919)); +#997=DIRECTION('',(1.,-0.,-0.)); +#998=VECTOR('',#997,3.266845356); +#999=LINE('',#996,#998); +#1000=EDGE_CURVE('',#989,#962,#999,.T.); +#1001=ORIENTED_EDGE('',*,*,#1000,.T.); +#1002=EDGE_LOOP('',(#971,#979,#987,#995,#1001)); +#1003=FACE_BOUND('',#1002,.T.); +#1004=ADVANCED_FACE('',(#1003),#960,.F.); +#1005=CARTESIAN_POINT('',(-20.,20.414253545,16.33337546)); +#1006=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#1007=DIRECTION('',(0.,0.682591464,-0.730800173)); +#1008=AXIS2_PLACEMENT_3D('',#1005,#1006,#1007); +#1009=PLANE('',#1008); +#1010=CARTESIAN_POINT('',(-23.5,12.7932075,24.492665558)); +#1011=VERTEX_POINT('',#1010); +#1012=CARTESIAN_POINT('',(-21.,12.7932075,24.492665558)); +#1013=VERTEX_POINT('',#1012); +#1014=CARTESIAN_POINT('',(-23.5,12.7932075,24.492665558)); +#1015=DIRECTION('',(1.,-0.,-0.)); +#1016=VECTOR('',#1015,2.5); +#1017=LINE('',#1014,#1016); +#1018=EDGE_CURVE('',#1011,#1013,#1017,.T.); +#1019=ORIENTED_EDGE('',*,*,#1018,.T.); +#1020=CARTESIAN_POINT('',(-21.,23.588248977,12.935213404)); +#1021=VERTEX_POINT('',#1020); +#1022=CARTESIAN_POINT('',(-21.,12.7932075,24.492665558)); +#1023=DIRECTION('',(0.,0.682591464,-0.730800173)); +#1024=VECTOR('',#1023,15.814791202); +#1025=LINE('',#1022,#1024); +#1026=EDGE_CURVE('',#1013,#1021,#1025,.T.); +#1027=ORIENTED_EDGE('',*,*,#1026,.T.); +#1028=CARTESIAN_POINT('',(-23.5,23.588248977,12.935213404)); +#1029=VERTEX_POINT('',#1028); +#1030=CARTESIAN_POINT('',(-21.,23.588248977,12.935213404)); +#1031=DIRECTION('',(-1.,0.,-0.)); +#1032=VECTOR('',#1031,2.5); +#1033=LINE('',#1030,#1032); +#1034=EDGE_CURVE('',#1021,#1029,#1033,.T.); +#1035=ORIENTED_EDGE('',*,*,#1034,.T.); +#1036=CARTESIAN_POINT('',(-23.5,23.588248977,12.935213404)); +#1037=DIRECTION('',(-0.,-0.682591464,0.730800173)); +#1038=VECTOR('',#1037,15.814791202); +#1039=LINE('',#1036,#1038); +#1040=EDGE_CURVE('',#1029,#1011,#1039,.T.); +#1041=ORIENTED_EDGE('',*,*,#1040,.T.); +#1042=EDGE_LOOP('',(#1019,#1027,#1035,#1041)); +#1043=FACE_BOUND('',#1042,.T.); +#1044=ADVANCED_FACE('',(#1043),#1009,.F.); +#1045=CARTESIAN_POINT('',(0.,-24.665063509,24.089745962)); +#1046=DIRECTION('',(0.,-0.5,0.866025404)); +#1047=DIRECTION('',(1.,0.,0.)); +#1048=AXIS2_PLACEMENT_3D('',#1045,#1046,#1047); +#1049=PLANE('',#1048); +#1050=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962)); +#1051=VERTEX_POINT('',#1050); +#1052=CARTESIAN_POINT('',(32.686519869,-20.334936491,26.589745962)); +#1053=DIRECTION('',(0.062573166,-0.864328323,-0.49902019)); +#1054=VECTOR('',#1053,5.009817341); +#1055=LINE('',#1052,#1054); +#1056=EDGE_CURVE('',#800,#1051,#1055,.T.); +#1057=ORIENTED_EDGE('',*,*,#1056,.F.); +#1058=ORIENTED_EDGE('',*,*,#805,.T.); +#1059=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962)); +#1060=DIRECTION('',(0.,0.866025404,0.5)); +#1061=VECTOR('',#1060,5.); +#1062=LINE('',#1059,#1061); +#1063=EDGE_CURVE('',#1051,#792,#1062,.T.); +#1064=ORIENTED_EDGE('',*,*,#1063,.F.); +#1065=EDGE_LOOP('',(#1057,#1058,#1064)); +#1066=FACE_BOUND('',#1065,.T.); +#1067=ADVANCED_FACE('',(#1066),#1049,.F.); +#1068=CARTESIAN_POINT('',(-22.5,-21.004809472,37.75)); +#1069=DIRECTION('',(0.,-0.866025404,-0.5)); +#1070=DIRECTION('',(0.,0.5,-0.866025404)); +#1071=AXIS2_PLACEMENT_3D('',#1068,#1069,#1070); +#1072=CYLINDRICAL_SURFACE('',#1071,1.75); +#1073=CARTESIAN_POINT('',(-22.5,-28.790063509,31.234455543)); +#1074=VERTEX_POINT('',#1073); +#1075=CARTESIAN_POINT('',(-22.5,-28.790063509,31.234455543)); +#1076=DIRECTION('',(-0.,0.866025404,0.5)); +#1077=VECTOR('',#1076,5.); +#1078=LINE('',#1075,#1077); +#1079=EDGE_CURVE('',#1074,#907,#1078,.T.); +#1080=ORIENTED_EDGE('',*,*,#1079,.F.); +#1081=CARTESIAN_POINT('',(-22.5,-29.665063509,32.75)); +#1082=DIRECTION('',(0.,-0.866025404,-0.5)); +#1083=DIRECTION('',(0.,0.5,-0.866025404)); +#1084=AXIS2_PLACEMENT_3D('',#1081,#1082,#1083); +#1085=CIRCLE('',#1084,1.75); +#1086=EDGE_CURVE('',#1074,#1074,#1085,.T.); +#1087=ORIENTED_EDGE('',*,*,#1086,.T.); +#1088=ORIENTED_EDGE('',*,*,#1079,.T.); +#1089=ORIENTED_EDGE('',*,*,#913,.T.); +#1090=EDGE_LOOP('',(#1080,#1087,#1088,#1089)); +#1091=FACE_BOUND('',#1090,.T.); +#1092=ADVANCED_FACE('',(#1091),#1072,.F.); +#1093=CARTESIAN_POINT('',(22.5,-21.004809472,37.75)); +#1094=DIRECTION('',(0.,-0.866025404,-0.5)); +#1095=DIRECTION('',(0.,0.5,-0.866025404)); +#1096=AXIS2_PLACEMENT_3D('',#1093,#1094,#1095); +#1097=CYLINDRICAL_SURFACE('',#1096,1.75); +#1098=CARTESIAN_POINT('',(22.5,-28.790063509,31.234455543)); +#1099=VERTEX_POINT('',#1098); +#1100=CARTESIAN_POINT('',(22.5,-28.790063509,31.234455543)); +#1101=DIRECTION('',(-0.,0.866025404,0.5)); +#1102=VECTOR('',#1101,5.); +#1103=LINE('',#1100,#1102); +#1104=EDGE_CURVE('',#1099,#896,#1103,.T.); +#1105=ORIENTED_EDGE('',*,*,#1104,.F.); +#1106=CARTESIAN_POINT('',(22.5,-29.665063509,32.75)); +#1107=DIRECTION('',(0.,-0.866025404,-0.5)); +#1108=DIRECTION('',(0.,0.5,-0.866025404)); +#1109=AXIS2_PLACEMENT_3D('',#1106,#1107,#1108); +#1110=CIRCLE('',#1109,1.75); +#1111=EDGE_CURVE('',#1099,#1099,#1110,.T.); +#1112=ORIENTED_EDGE('',*,*,#1111,.T.); +#1113=ORIENTED_EDGE('',*,*,#1104,.T.); +#1114=ORIENTED_EDGE('',*,*,#902,.T.); +#1115=EDGE_LOOP('',(#1105,#1112,#1113,#1114)); +#1116=FACE_BOUND('',#1115,.T.); +#1117=ADVANCED_FACE('',(#1116),#1097,.F.); +#1118=CARTESIAN_POINT('',(0.,-12.665063509,3.305136271)); +#1119=DIRECTION('',(0.,-0.866025404,-0.5)); +#1120=DIRECTION('',(0.,0.5,-0.866025404)); +#1121=AXIS2_PLACEMENT_3D('',#1118,#1119,#1120); +#1122=PLANE('',#1121); +#1123=ORIENTED_EDGE('',*,*,#1111,.F.); +#1124=EDGE_LOOP('',(#1123)); +#1125=FACE_BOUND('',#1124,.T.); +#1126=CARTESIAN_POINT('',(-37.,-33.665063509,39.67820323)); +#1127=VERTEX_POINT('',#1126); +#1128=CARTESIAN_POINT('',(-37.,-25.465063509,25.475386608)); +#1129=VERTEX_POINT('',#1128); +#1130=CARTESIAN_POINT('',(-37.,-33.665063509,39.67820323)); +#1131=DIRECTION('',(0.,0.5,-0.866025404)); +#1132=VECTOR('',#1131,16.4); +#1133=LINE('',#1130,#1132); +#1134=EDGE_CURVE('',#1127,#1129,#1133,.T.); +#1135=ORIENTED_EDGE('',*,*,#1134,.T.); +#1136=CARTESIAN_POINT('',(-35.4,-24.665063509,24.089745962)); +#1137=VERTEX_POINT('',#1136); +#1138=CARTESIAN_POINT('',(-35.4,-25.465063509,25.475386608)); +#1139=DIRECTION('',(0.,-0.866025404,-0.5)); +#1140=DIRECTION('',(0.,0.5,-0.866025404)); +#1141=AXIS2_PLACEMENT_3D('',#1138,#1139,#1140); +#1142=CIRCLE('',#1141,1.6); +#1143=EDGE_CURVE('',#1129,#1137,#1142,.T.); +#1144=ORIENTED_EDGE('',*,*,#1143,.T.); +#1145=CARTESIAN_POINT('',(-34.285058142,-24.665063509,24.089745962)); +#1146=VERTEX_POINT('',#1145); +#1147=CARTESIAN_POINT('',(-34.285058142,-24.665063509,24.089745962)); +#1148=DIRECTION('',(-1.,-0.,0.)); +#1149=VECTOR('',#1148,1.114941858); +#1150=LINE('',#1147,#1149); +#1151=EDGE_CURVE('',#1146,#1137,#1150,.T.); +#1152=ORIENTED_EDGE('',*,*,#1151,.F.); +#1153=CARTESIAN_POINT('',(-34.285058142,-24.665063509,24.089745962)); +#1154=DIRECTION('',(1.,0.,-0.)); +#1155=VECTOR('',#1154,67.285058142); +#1156=LINE('',#1153,#1155); +#1157=EDGE_CURVE('',#1146,#1051,#1156,.T.); +#1158=ORIENTED_EDGE('',*,*,#1157,.T.); +#1159=CARTESIAN_POINT('',(33.,-33.665063509,39.67820323)); +#1160=VERTEX_POINT('',#1159); +#1161=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962)); +#1162=DIRECTION('',(0.,-0.5,0.866025404)); +#1163=VECTOR('',#1162,18.); +#1164=LINE('',#1161,#1163); +#1165=EDGE_CURVE('',#1051,#1160,#1164,.T.); +#1166=ORIENTED_EDGE('',*,*,#1165,.T.); +#1167=CARTESIAN_POINT('',(31.,-34.665063509,41.410254038)); +#1168=VERTEX_POINT('',#1167); +#1169=CARTESIAN_POINT('',(31.,-33.665063509,39.67820323)); +#1170=DIRECTION('',(0.,-0.866025404,-0.5)); +#1171=DIRECTION('',(0.,0.5,-0.866025404)); +#1172=AXIS2_PLACEMENT_3D('',#1169,#1170,#1171); +#1173=CIRCLE('',#1172,2.); +#1174=EDGE_CURVE('',#1160,#1168,#1173,.T.); +#1175=ORIENTED_EDGE('',*,*,#1174,.T.); +#1176=CARTESIAN_POINT('',(-35.,-34.665063509,41.410254038)); +#1177=VERTEX_POINT('',#1176); +#1178=CARTESIAN_POINT('',(31.,-34.665063509,41.410254038)); +#1179=DIRECTION('',(-1.,0.,0.)); +#1180=VECTOR('',#1179,66.); +#1181=LINE('',#1178,#1180); +#1182=EDGE_CURVE('',#1168,#1177,#1181,.T.); +#1183=ORIENTED_EDGE('',*,*,#1182,.T.); +#1184=CARTESIAN_POINT('',(-35.,-33.665063509,39.67820323)); +#1185=DIRECTION('',(0.,-0.866025404,-0.5)); +#1186=DIRECTION('',(0.,0.5,-0.866025404)); +#1187=AXIS2_PLACEMENT_3D('',#1184,#1185,#1186); +#1188=CIRCLE('',#1187,2.); +#1189=EDGE_CURVE('',#1177,#1127,#1188,.T.); +#1190=ORIENTED_EDGE('',*,*,#1189,.T.); +#1191=EDGE_LOOP('',(#1135,#1144,#1152,#1158,#1166,#1175,#1183,#1190)); +#1192=FACE_BOUND('',#1191,.T.); +#1193=ORIENTED_EDGE('',*,*,#1086,.F.); +#1194=EDGE_LOOP('',(#1193)); +#1195=FACE_BOUND('',#1194,.T.); +#1196=ADVANCED_FACE('',(#1125,#1192,#1195),#1122,.T.); +#1197=CARTESIAN_POINT('',(0.,-24.665063509,24.089745962)); +#1198=DIRECTION('',(0.,-0.5,0.866025404)); +#1199=DIRECTION('',(1.,0.,0.)); +#1200=AXIS2_PLACEMENT_3D('',#1197,#1198,#1199); +#1201=PLANE('',#1200); +#1202=CARTESIAN_POINT('',(-35.4,-21.720577137,25.789745962)); +#1203=VERTEX_POINT('',#1202); +#1204=CARTESIAN_POINT('',(-34.071891653,-21.720577137,25.789745962)); +#1205=VERTEX_POINT('',#1204); +#1206=CARTESIAN_POINT('',(-35.4,-21.720577137,25.789745962)); +#1207=DIRECTION('',(1.,0.,-0.)); +#1208=VECTOR('',#1207,1.328108347); +#1209=LINE('',#1206,#1208); +#1210=EDGE_CURVE('',#1203,#1205,#1209,.T.); +#1211=ORIENTED_EDGE('',*,*,#1210,.T.); +#1212=CARTESIAN_POINT('',(-34.071891653,-21.720577137,25.789745962)); +#1213=DIRECTION('',(-0.062573166,-0.864328323,-0.49902019)); +#1214=VECTOR('',#1213,3.406675792); +#1215=LINE('',#1212,#1214); +#1216=EDGE_CURVE('',#1205,#1146,#1215,.T.); +#1217=ORIENTED_EDGE('',*,*,#1216,.T.); +#1218=ORIENTED_EDGE('',*,*,#1151,.T.); +#1219=CARTESIAN_POINT('',(-35.4,-24.665063509,24.089745962)); +#1220=DIRECTION('',(0.,0.866025404,0.5)); +#1221=VECTOR('',#1220,3.4); +#1222=LINE('',#1219,#1221); +#1223=EDGE_CURVE('',#1137,#1203,#1222,.T.); +#1224=ORIENTED_EDGE('',*,*,#1223,.T.); +#1225=EDGE_LOOP('',(#1211,#1217,#1218,#1224)); +#1226=FACE_BOUND('',#1225,.T.); +#1227=ADVANCED_FACE('',(#1226),#1201,.F.); +#1228=CARTESIAN_POINT('',(-37.,-21.004809472,37.75)); +#1229=DIRECTION('',(-1.,0.,0.)); +#1230=DIRECTION('',(0.,-0.5,0.866025404)); +#1231=AXIS2_PLACEMENT_3D('',#1228,#1229,#1230); +#1232=PLANE('',#1231); +#1233=CARTESIAN_POINT('',(-37.,-30.720577137,41.37820323)); +#1234=VERTEX_POINT('',#1233); +#1235=CARTESIAN_POINT('',(-37.,-33.665063509,39.67820323)); +#1236=DIRECTION('',(-0.,0.866025404,0.5)); +#1237=VECTOR('',#1236,3.4); +#1238=LINE('',#1235,#1237); +#1239=EDGE_CURVE('',#1127,#1234,#1238,.T.); +#1240=ORIENTED_EDGE('',*,*,#1239,.T.); +#1241=CARTESIAN_POINT('',(-37.,-22.520577137,27.175386608)); +#1242=VERTEX_POINT('',#1241); +#1243=CARTESIAN_POINT('',(-37.,-30.720577137,41.37820323)); +#1244=DIRECTION('',(-0.,0.5,-0.866025404)); +#1245=VECTOR('',#1244,16.4); +#1246=LINE('',#1243,#1245); +#1247=EDGE_CURVE('',#1234,#1242,#1246,.T.); +#1248=ORIENTED_EDGE('',*,*,#1247,.T.); +#1249=CARTESIAN_POINT('',(-37.,-22.520577137,27.175386608)); +#1250=DIRECTION('',(-0.,-0.866025404,-0.5)); +#1251=VECTOR('',#1250,3.4); +#1252=LINE('',#1249,#1251); +#1253=EDGE_CURVE('',#1242,#1129,#1252,.T.); +#1254=ORIENTED_EDGE('',*,*,#1253,.T.); +#1255=ORIENTED_EDGE('',*,*,#1134,.F.); +#1256=EDGE_LOOP('',(#1240,#1248,#1254,#1255)); +#1257=FACE_BOUND('',#1256,.T.); +#1258=ADVANCED_FACE('',(#1257),#1232,.T.); +#1259=CARTESIAN_POINT('',(0.,-26.004809472,46.410254038)); +#1260=DIRECTION('',(0.,-0.5,0.866025404)); +#1261=DIRECTION('',(1.,0.,0.)); +#1262=AXIS2_PLACEMENT_3D('',#1259,#1260,#1261); +#1263=PLANE('',#1262); +#1264=ORIENTED_EDGE('',*,*,#1182,.F.); +#1265=CARTESIAN_POINT('',(31.,-32.066987298,42.910254038)); +#1266=VERTEX_POINT('',#1265); +#1267=CARTESIAN_POINT('',(31.,-34.665063509,41.410254038)); +#1268=DIRECTION('',(-0.,0.866025404,0.5)); +#1269=VECTOR('',#1268,3.); +#1270=LINE('',#1267,#1269); +#1271=EDGE_CURVE('',#1168,#1266,#1270,.T.); +#1272=ORIENTED_EDGE('',*,*,#1271,.T.); +#1273=CARTESIAN_POINT('',(-35.,-32.066987298,42.910254038)); +#1274=VERTEX_POINT('',#1273); +#1275=CARTESIAN_POINT('',(31.,-32.066987298,42.910254038)); +#1276=DIRECTION('',(-1.,-0.,0.)); +#1277=VECTOR('',#1276,66.); +#1278=LINE('',#1275,#1277); +#1279=EDGE_CURVE('',#1266,#1274,#1278,.T.); +#1280=ORIENTED_EDGE('',*,*,#1279,.T.); +#1281=CARTESIAN_POINT('',(-35.,-32.066987298,42.910254038)); +#1282=DIRECTION('',(0.,-0.866025404,-0.5)); +#1283=VECTOR('',#1282,3.); +#1284=LINE('',#1281,#1283); +#1285=EDGE_CURVE('',#1274,#1177,#1284,.T.); +#1286=ORIENTED_EDGE('',*,*,#1285,.T.); +#1287=EDGE_LOOP('',(#1264,#1272,#1280,#1286)); +#1288=FACE_BOUND('',#1287,.T.); +#1289=ADVANCED_FACE('',(#1288),#1263,.T.); +#1290=CARTESIAN_POINT('',(33.,-21.004809472,37.75)); +#1291=DIRECTION('',(1.,0.,0.)); +#1292=DIRECTION('',(0.,0.5,-0.866025404)); +#1293=AXIS2_PLACEMENT_3D('',#1290,#1291,#1292); +#1294=PLANE('',#1293); +#1295=ORIENTED_EDGE('',*,*,#797,.F.); +#1296=CARTESIAN_POINT('',(33.,-29.334936491,42.17820323)); +#1297=DIRECTION('',(0.,-0.866025404,-0.5)); +#1298=VECTOR('',#1297,5.); +#1299=LINE('',#1296,#1298); +#1300=EDGE_CURVE('',#784,#1160,#1299,.T.); +#1301=ORIENTED_EDGE('',*,*,#1300,.T.); +#1302=ORIENTED_EDGE('',*,*,#1165,.F.); +#1303=ORIENTED_EDGE('',*,*,#1063,.T.); +#1304=EDGE_LOOP('',(#1295,#1301,#1302,#1303)); +#1305=FACE_BOUND('',#1304,.T.); +#1306=ADVANCED_FACE('',(#1305),#1294,.T.); +#1307=CARTESIAN_POINT('',(-29.,-8.838961155,15.621877938)); +#1308=DIRECTION('',(-0.974119904,0.161703434,-0.157931669)); +#1309=DIRECTION('',(-0.163758597,-0.986500442,-0.)); +#1310=AXIS2_PLACEMENT_3D('',#1307,#1308,#1309); +#1311=PLANE('',#1310); +#1312=ORIENTED_EDGE('',*,*,#450,.T.); +#1313=CARTESIAN_POINT('',(-25.472564566,-1.456979379,1.422995043)); +#1314=VERTEX_POINT('',#1313); +#1315=CARTESIAN_POINT('',(-25.472564566,2.036591221,5.)); +#1316=DIRECTION('',(-0.974119904,0.161703434,-0.157931669)); +#1317=DIRECTION('',(-0.226031883,-0.696886345,0.680631332)); +#1318=AXIS2_PLACEMENT_3D('',#1315,#1316,#1317); +#1319=ELLIPSE('',#1318,5.132838348,5.); +#1320=EDGE_CURVE('',#438,#1314,#1319,.T.); +#1321=ORIENTED_EDGE('',*,*,#1320,.T.); +#1322=CARTESIAN_POINT('',(-32.698314601,-23.734927318,23.181305384)); +#1323=VERTEX_POINT('',#1322); +#1324=CARTESIAN_POINT('',(-32.698314601,-23.734927318,23.181305384)); +#1325=DIRECTION('',(0.226031883,0.696886345,-0.680631332)); +#1326=VECTOR('',#1325,31.967835349); +#1327=LINE('',#1324,#1326); +#1328=EDGE_CURVE('',#1323,#1314,#1327,.T.); +#1329=ORIENTED_EDGE('',*,*,#1328,.F.); +#1330=CARTESIAN_POINT('',(-32.513299806,-21.17930263,24.656795986)); +#1331=VERTEX_POINT('',#1330); +#1332=CARTESIAN_POINT('',(-32.698314601,-23.734927318,23.181305384)); +#1333=DIRECTION('',(0.062573166,0.864328323,0.49902019)); +#1334=VECTOR('',#1333,2.956775361); +#1335=LINE('',#1332,#1334); +#1336=EDGE_CURVE('',#1323,#1331,#1335,.T.); +#1337=ORIENTED_EDGE('',*,*,#1336,.T.); +#1338=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094)); +#1339=VERTEX_POINT('',#1338); +#1340=CARTESIAN_POINT('',(-33.228200065,-22.77930263,27.428077278)); +#1341=DIRECTION('',(0.974119904,-0.161703434,0.157931669)); +#1342=DIRECTION('',(0.226031883,0.696886345,-0.680631332)); +#1343=AXIS2_PLACEMENT_3D('',#1340,#1341,#1342); +#1344=ELLIPSE('',#1343,3.285016543,3.2); +#1345=EDGE_CURVE('',#1331,#1339,#1344,.T.); +#1346=ORIENTED_EDGE('',*,*,#1345,.T.); +#1347=CARTESIAN_POINT('',(-33.228200065,-22.77930263,27.428077278)); +#1348=DIRECTION('',(0.974119904,-0.161703434,0.157931669)); +#1349=DIRECTION('',(0.226031883,0.696886345,-0.680631332)); +#1350=AXIS2_PLACEMENT_3D('',#1347,#1348,#1349); +#1351=ELLIPSE('',#1350,3.285016543,3.2); +#1352=EDGE_CURVE('',#1339,#933,#1351,.T.); +#1353=ORIENTED_EDGE('',*,*,#1352,.T.); +#1354=ORIENTED_EDGE('',*,*,#938,.T.); +#1355=EDGE_LOOP('',(#1312,#1321,#1329,#1337,#1346,#1353,#1354)); +#1356=FACE_BOUND('',#1355,.T.); +#1357=ADVANCED_FACE('',(#1356),#1311,.T.); +#1358=CARTESIAN_POINT('',(29.,-8.838961155,15.621877938)); +#1359=DIRECTION('',(-0.974119904,-0.161703434,0.157931669)); +#1360=DIRECTION('',(0.163758597,-0.986500442,-0.)); +#1361=AXIS2_PLACEMENT_3D('',#1358,#1359,#1360); +#1362=PLANE('',#1361); +#1363=CARTESIAN_POINT('',(25.472564566,-1.456979379,1.422995043)); +#1364=VERTEX_POINT('',#1363); +#1365=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962)); +#1366=DIRECTION('',(-0.226031883,0.696886345,-0.680631332)); +#1367=VECTOR('',#1366,33.302538199); +#1368=LINE('',#1365,#1367); +#1369=EDGE_CURVE('',#1051,#1364,#1368,.T.); +#1370=ORIENTED_EDGE('',*,*,#1369,.T.); +#1371=CARTESIAN_POINT('',(25.472564566,2.036591221,5.)); +#1372=DIRECTION('',(0.974119904,0.161703434,-0.157931669)); +#1373=DIRECTION('',(-0.226031883,0.696886345,-0.680631332)); +#1374=AXIS2_PLACEMENT_3D('',#1371,#1372,#1373); +#1375=ELLIPSE('',#1374,5.132838348,5.); +#1376=EDGE_CURVE('',#1364,#288,#1375,.T.); +#1377=ORIENTED_EDGE('',*,*,#1376,.T.); +#1378=ORIENTED_EDGE('',*,*,#293,.F.); +#1379=ORIENTED_EDGE('',*,*,#593,.F.); +#1380=ORIENTED_EDGE('',*,*,#811,.T.); +#1381=ORIENTED_EDGE('',*,*,#1056,.T.); +#1382=EDGE_LOOP('',(#1370,#1377,#1378,#1379,#1380,#1381)); +#1383=FACE_BOUND('',#1382,.T.); +#1384=ADVANCED_FACE('',(#1383),#1362,.F.); +#1385=CARTESIAN_POINT('',(0.,-0.,-0.)); +#1386=DIRECTION('',(0.,0.69871412,0.715400991)); +#1387=DIRECTION('',(-1.,0.,0.)); +#1388=AXIS2_PLACEMENT_3D('',#1385,#1386,#1387); +#1389=PLANE('',#1388); +#1390=ORIENTED_EDGE('',*,*,#1157,.F.); +#1391=CARTESIAN_POINT('',(-34.256906448,-23.476201825,22.928614714)); +#1392=DIRECTION('',(0.,0.69871412,0.715400991)); +#1393=DIRECTION('',(-0.226031883,-0.696886345,0.680631332)); +#1394=AXIS2_PLACEMENT_3D('',#1391,#1392,#1393); +#1395=ELLIPSE('',#1394,1.66507454,1.6); +#1396=EDGE_CURVE('',#1146,#1323,#1395,.T.); +#1397=ORIENTED_EDGE('',*,*,#1396,.T.); +#1398=ORIENTED_EDGE('',*,*,#1328,.T.); +#1399=CARTESIAN_POINT('',(-25.472564566,-1.456979379,1.422995043)); +#1400=DIRECTION('',(1.,-0.,-0.)); +#1401=VECTOR('',#1400,50.945129132); +#1402=LINE('',#1399,#1401); +#1403=EDGE_CURVE('',#1314,#1364,#1402,.T.); +#1404=ORIENTED_EDGE('',*,*,#1403,.T.); +#1405=ORIENTED_EDGE('',*,*,#1369,.F.); +#1406=EDGE_LOOP('',(#1390,#1397,#1398,#1404,#1405)); +#1407=FACE_BOUND('',#1406,.T.); +#1408=ADVANCED_FACE('',(#1407),#1389,.F.); +#1409=CARTESIAN_POINT('',(-20.,5.485205765,17.666750919)); +#1410=DIRECTION('',(-1.,0.,0.)); +#1411=DIRECTION('',(0.,0.,1.)); +#1412=AXIS2_PLACEMENT_3D('',#1409,#1410,#1411); +#1413=CYLINDRICAL_SURFACE('',#1412,10.); +#1414=ORIENTED_EDGE('',*,*,#986,.F.); +#1415=CARTESIAN_POINT('',(-21.,5.485205765,17.666750919)); +#1416=DIRECTION('',(-1.,0.,0.)); +#1417=DIRECTION('',(0.,0.,1.)); +#1418=AXIS2_PLACEMENT_3D('',#1415,#1416,#1417); +#1419=CIRCLE('',#1418,10.); +#1420=EDGE_CURVE('',#973,#1013,#1419,.T.); +#1421=ORIENTED_EDGE('',*,*,#1420,.T.); +#1422=ORIENTED_EDGE('',*,*,#1018,.F.); +#1423=CARTESIAN_POINT('',(-23.5,5.485205765,17.666750919)); +#1424=DIRECTION('',(1.,-0.,-0.)); +#1425=DIRECTION('',(0.,0.,1.)); +#1426=AXIS2_PLACEMENT_3D('',#1423,#1424,#1425); +#1427=CIRCLE('',#1426,10.); +#1428=EDGE_CURVE('',#1011,#981,#1427,.T.); +#1429=ORIENTED_EDGE('',*,*,#1428,.T.); +#1430=EDGE_LOOP('',(#1414,#1421,#1422,#1429)); +#1431=FACE_BOUND('',#1430,.T.); +#1432=ADVANCED_FACE('',(#1431),#1413,.T.); +#1433=CARTESIAN_POINT('',(20.,5.485205765,17.666750919)); +#1434=DIRECTION('',(1.,0.,0.)); +#1435=DIRECTION('',(0.,0.,-1.)); +#1436=AXIS2_PLACEMENT_3D('',#1433,#1434,#1435); +#1437=CYLINDRICAL_SURFACE('',#1436,10.); +#1438=ORIENTED_EDGE('',*,*,#732,.F.); +#1439=CARTESIAN_POINT('',(21.,5.485205765,17.666750919)); +#1440=DIRECTION('',(1.,0.,0.)); +#1441=DIRECTION('',(0.,0.,-1.)); +#1442=AXIS2_PLACEMENT_3D('',#1439,#1440,#1441); +#1443=CIRCLE('',#1442,10.); +#1444=EDGE_CURVE('',#719,#662,#1443,.T.); +#1445=ORIENTED_EDGE('',*,*,#1444,.T.); +#1446=ORIENTED_EDGE('',*,*,#667,.F.); +#1447=CARTESIAN_POINT('',(23.5,5.485205765,17.666750919)); +#1448=DIRECTION('',(-1.,-0.,-0.)); +#1449=DIRECTION('',(0.,0.,-1.)); +#1450=AXIS2_PLACEMENT_3D('',#1447,#1448,#1449); +#1451=CIRCLE('',#1450,10.); +#1452=EDGE_CURVE('',#660,#727,#1451,.T.); +#1453=ORIENTED_EDGE('',*,*,#1452,.T.); +#1454=EDGE_LOOP('',(#1438,#1445,#1446,#1453)); +#1455=FACE_BOUND('',#1454,.T.); +#1456=ADVANCED_FACE('',(#1455),#1437,.T.); +#1457=CARTESIAN_POINT('',(-0.,41.858253313,30.)); +#1458=DIRECTION('',(1.,-0.,0.)); +#1459=DIRECTION('',(0.,-0.,-1.)); +#1460=AXIS2_PLACEMENT_3D('',#1457,#1458,#1459); +#1461=CYLINDRICAL_SURFACE('',#1460,25.); +#1462=ORIENTED_EDGE('',*,*,#1034,.F.); +#1463=CARTESIAN_POINT('',(-21.,28.534785562,8.846153846)); +#1464=VERTEX_POINT('',#1463); +#1465=CARTESIAN_POINT('',(-21.,41.858253313,30.)); +#1466=DIRECTION('',(1.,-0.,-0.)); +#1467=DIRECTION('',(0.,0.,1.)); +#1468=AXIS2_PLACEMENT_3D('',#1465,#1466,#1467); +#1469=CIRCLE('',#1468,25.); +#1470=EDGE_CURVE('',#1021,#1464,#1469,.T.); +#1471=ORIENTED_EDGE('',*,*,#1470,.T.); +#1472=CARTESIAN_POINT('',(-21.,28.534785562,8.846153846)); +#1473=CARTESIAN_POINT('',(-21.,29.057908801,8.516671654)); +#1474=CARTESIAN_POINT('',(-20.956795278,29.586215266,8.210931006)); +#1475=CARTESIAN_POINT('',(-20.884026028,30.120695368,7.926719014)); +#1476=CARTESIAN_POINT('',(-20.811256778,30.65517547,7.642507021)); +#1477=CARTESIAN_POINT('',(-20.708584724,31.195799437,7.379868084)); +#1478=CARTESIAN_POINT('',(-20.583706147,31.74319075,7.13768364)); +#1479=CARTESIAN_POINT('',(-20.521266858,32.016886406,7.016591418)); +#1480=CARTESIAN_POINT('',(-20.453283514,32.29227964,6.900622153)); +#1481=CARTESIAN_POINT('',(-20.380302398,32.569421183,6.789709226)); +#1482=CARTESIAN_POINT('',(-20.307321283,32.846562727,6.6787963)); +#1483=CARTESIAN_POINT('',(-20.229189492,33.126026116,6.572748751)); +#1484=CARTESIAN_POINT('',(-20.147420608,33.405031464,6.472504587)); +#1485=CARTESIAN_POINT('',(-19.98388284,33.96304216,6.272016259)); +#1486=CARTESIAN_POINT('',(-19.805364252,34.520747681,6.093983237)); +#1487=CARTESIAN_POINT('',(-19.616116666,35.079205076,5.936656404)); +#1488=CARTESIAN_POINT('',(-19.237621494,36.196119866,5.62200274)); +#1489=CARTESIAN_POINT('',(-18.816548763,37.316053517,5.389695945)); +#1490=CARTESIAN_POINT('',(-18.374224551,38.444963072,5.234107128)); +#1491=CARTESIAN_POINT('',(-18.153062445,39.009417849,5.15631272)); +#1492=CARTESIAN_POINT('',(-17.926439584,39.576096284,5.097837104)); +#1493=CARTESIAN_POINT('',(-17.696369302,40.14568207,5.058726982)); +#1494=CARTESIAN_POINT('',(-17.466299019,40.715267856,5.019616859)); +#1495=CARTESIAN_POINT('',(-17.233016454,41.287024083,5.)); +#1496=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#1497=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1472,#1473,#1474,#1475,#1476,#1477,#1478,#1479,#1480,#1481,#1482,#1483,#1484,#1485,#1486,#1487,#1488,#1489,#1490,#1491,#1492,#1493,#1494,#1495,#1496),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.); +#1498=EDGE_CURVE('',#1464,#189,#1497,.T.); +#1499=ORIENTED_EDGE('',*,*,#1498,.T.); +#1500=ORIENTED_EDGE('',*,*,#250,.F.); +#1501=CARTESIAN_POINT('',(-23.5,41.858253313,30.)); +#1502=DIRECTION('',(-1.,0.,0.)); +#1503=DIRECTION('',(0.,0.,1.)); +#1504=AXIS2_PLACEMENT_3D('',#1501,#1502,#1503); +#1505=CIRCLE('',#1504,25.); +#1506=EDGE_CURVE('',#239,#1029,#1505,.T.); +#1507=ORIENTED_EDGE('',*,*,#1506,.T.); +#1508=EDGE_LOOP('',(#1462,#1471,#1499,#1500,#1507)); +#1509=FACE_BOUND('',#1508,.T.); +#1510=ADVANCED_FACE('',(#1509),#1461,.F.); +#1511=CARTESIAN_POINT('',(20.,41.858253313,30.)); +#1512=DIRECTION('',(-1.,0.,-0.)); +#1513=DIRECTION('',(-0.,0.,1.)); +#1514=AXIS2_PLACEMENT_3D('',#1511,#1512,#1513); +#1515=CYLINDRICAL_SURFACE('',#1514,25.); +#1516=CARTESIAN_POINT('',(21.,28.534785562,8.846153846)); +#1517=VERTEX_POINT('',#1516); +#1518=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#1519=CARTESIAN_POINT('',(17.233016454,41.287024083,5.)); +#1520=CARTESIAN_POINT('',(17.466299019,40.715267856,5.019616859)); +#1521=CARTESIAN_POINT('',(17.696369302,40.14568207,5.058726982)); +#1522=CARTESIAN_POINT('',(17.926439584,39.576096284,5.097837104)); +#1523=CARTESIAN_POINT('',(18.153062445,39.009417849,5.15631272)); +#1524=CARTESIAN_POINT('',(18.374224551,38.444963072,5.234107128)); +#1525=CARTESIAN_POINT('',(18.816548763,37.316053517,5.389695945)); +#1526=CARTESIAN_POINT('',(19.237621494,36.196119866,5.62200274)); +#1527=CARTESIAN_POINT('',(19.616116666,35.079205076,5.936656404)); +#1528=CARTESIAN_POINT('',(19.805364252,34.520747681,6.093983237)); +#1529=CARTESIAN_POINT('',(19.98388284,33.96304216,6.272016259)); +#1530=CARTESIAN_POINT('',(20.147420608,33.405031464,6.472504587)); +#1531=CARTESIAN_POINT('',(20.229189492,33.126026116,6.572748751)); +#1532=CARTESIAN_POINT('',(20.307321283,32.846562727,6.6787963)); +#1533=CARTESIAN_POINT('',(20.380302398,32.569421183,6.789709226)); +#1534=CARTESIAN_POINT('',(20.453283514,32.29227964,6.900622153)); +#1535=CARTESIAN_POINT('',(20.521266858,32.016886406,7.016591418)); +#1536=CARTESIAN_POINT('',(20.583706147,31.74319075,7.13768364)); +#1537=CARTESIAN_POINT('',(20.708584724,31.195799437,7.379868084)); +#1538=CARTESIAN_POINT('',(20.811256778,30.65517547,7.642507021)); +#1539=CARTESIAN_POINT('',(20.884026028,30.120695368,7.926719014)); +#1540=CARTESIAN_POINT('',(20.956795278,29.586215266,8.210931006)); +#1541=CARTESIAN_POINT('',(21.,29.057908801,8.516671654)); +#1542=CARTESIAN_POINT('',(21.,28.534785562,8.846153846)); +#1543=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1518,#1519,#1520,#1521,#1522,#1523,#1524,#1525,#1526,#1527,#1528,#1529,#1530,#1531,#1532,#1533,#1534,#1535,#1536,#1537,#1538,#1539,#1540,#1541,#1542),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.007599542,0.009499427,0.01044937,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.); +#1544=EDGE_CURVE('',#207,#1517,#1543,.T.); +#1545=ORIENTED_EDGE('',*,*,#1544,.T.); +#1546=CARTESIAN_POINT('',(21.,41.858253313,30.)); +#1547=DIRECTION('',(-1.,-0.,-0.)); +#1548=DIRECTION('',(0.,0.,-1.)); +#1549=AXIS2_PLACEMENT_3D('',#1546,#1547,#1548); +#1550=CIRCLE('',#1549,25.); +#1551=EDGE_CURVE('',#1517,#711,#1550,.T.); +#1552=ORIENTED_EDGE('',*,*,#1551,.T.); +#1553=ORIENTED_EDGE('',*,*,#716,.F.); +#1554=CARTESIAN_POINT('',(23.5,41.858253313,30.)); +#1555=DIRECTION('',(1.,0.,0.)); +#1556=DIRECTION('',(0.,0.,-1.)); +#1557=AXIS2_PLACEMENT_3D('',#1554,#1555,#1556); +#1558=CIRCLE('',#1557,25.); +#1559=EDGE_CURVE('',#709,#215,#1558,.T.); +#1560=ORIENTED_EDGE('',*,*,#1559,.T.); +#1561=ORIENTED_EDGE('',*,*,#220,.F.); +#1562=EDGE_LOOP('',(#1545,#1552,#1553,#1560,#1561)); +#1563=FACE_BOUND('',#1562,.T.); +#1564=ADVANCED_FACE('',(#1563),#1515,.F.); +#1565=CARTESIAN_POINT('',(17.,0.,8.)); +#1566=DIRECTION('',(0.,-1.,0.)); +#1567=DIRECTION('',(0.,0.,-1.)); +#1568=AXIS2_PLACEMENT_3D('',#1565,#1566,#1567); +#1569=CYLINDRICAL_SURFACE('',#1568,3.); +#1570=ORIENTED_EDGE('',*,*,#82,.F.); +#1571=CARTESIAN_POINT('',(20.,28.001846852,8.)); +#1572=CARTESIAN_POINT('',(20.,28.54589502,7.74300389)); +#1573=CARTESIAN_POINT('',(19.967596458,29.095333744,7.504526185)); +#1574=CARTESIAN_POINT('',(19.91301952,29.65119305,7.282840831)); +#1575=CARTESIAN_POINT('',(19.858442583,30.207052357,7.061155477)); +#1576=CARTESIAN_POINT('',(19.781438541,30.769301281,6.856297106)); +#1577=CARTESIAN_POINT('',(19.687779608,31.338588247,6.66739324)); +#1578=CARTESIAN_POINT('',(19.640950142,31.62323173,6.572941307)); +#1579=CARTESIAN_POINT('',(19.589922062,31.909640198,6.482509675)); +#1580=CARTESIAN_POINT('',(19.535187483,32.197867633,6.395997372)); +#1581=CARTESIAN_POINT('',(19.480452904,32.486095069,6.309485069)); +#1582=CARTESIAN_POINT('',(19.421874368,32.776735903,6.22675548)); +#1583=CARTESIAN_POINT('',(19.36054821,33.066901538,6.14856484)); +#1584=CARTESIAN_POINT('',(19.237895893,33.647232809,5.99218356)); +#1585=CARTESIAN_POINT('',(19.104023183,34.227247455,5.85330693)); +#1586=CARTESIAN_POINT('',(18.962087494,34.808043146,5.730592001)); +#1587=CARTESIAN_POINT('',(18.678216116,35.969634528,5.485162143)); +#1588=CARTESIAN_POINT('',(18.362411557,37.134365521,5.303962851)); +#1589=CARTESIAN_POINT('',(18.030668408,38.308431462,5.182603572)); +#1590=CARTESIAN_POINT('',(17.864796834,38.895464433,5.121923933)); +#1591=CARTESIAN_POINT('',(17.69482063,39.484806861,5.076318457)); +#1592=CARTESIAN_POINT('',(17.522276087,40.077179202,5.045811839)); +#1593=CARTESIAN_POINT('',(17.349731543,40.669551542,5.01530522)); +#1594=CARTESIAN_POINT('',(17.174762593,41.264175045,5.)); +#1595=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#1596=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1571,#1572,#1573,#1574,#1575,#1576,#1577,#1578,#1579,#1580,#1581,#1582,#1583,#1584,#1585,#1586,#1587,#1588,#1589,#1590,#1591,#1592,#1593,#1594,#1595),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.); +#1597=EDGE_CURVE('',#68,#207,#1596,.T.); +#1598=ORIENTED_EDGE('',*,*,#1597,.T.); +#1599=ORIENTED_EDGE('',*,*,#212,.F.); +#1600=CARTESIAN_POINT('',(17.,4.480500687,8.)); +#1601=DIRECTION('',(0.,-1.,0.)); +#1602=DIRECTION('',(0.,0.,-1.)); +#1603=AXIS2_PLACEMENT_3D('',#1600,#1601,#1602); +#1604=CIRCLE('',#1603,3.); +#1605=EDGE_CURVE('',#199,#77,#1604,.T.); +#1606=ORIENTED_EDGE('',*,*,#1605,.T.); +#1607=EDGE_LOOP('',(#1570,#1598,#1599,#1606)); +#1608=FACE_BOUND('',#1607,.T.); +#1609=ADVANCED_FACE('',(#1608),#1569,.F.); +#1610=CARTESIAN_POINT('',(17.,5.58971296,5.723207931)); +#1611=DIRECTION('',(0.,-0.715400991,0.69871412)); +#1612=DIRECTION('',(0.,-0.69871412,-0.715400991)); +#1613=AXIS2_PLACEMENT_3D('',#1610,#1611,#1612); +#1614=CYLINDRICAL_SURFACE('',#1613,3.); +#1615=ORIENTED_EDGE('',*,*,#851,.F.); +#1616=CARTESIAN_POINT('',(19.424865983,-18.813301404,27.087969303)); +#1617=VERTEX_POINT('',#1616); +#1618=CARTESIAN_POINT('',(18.461329278,-21.382228865,28.403710911)); +#1619=CARTESIAN_POINT('',(18.463116984,-21.280666691,28.30591146)); +#1620=CARTESIAN_POINT('',(18.475007024,-21.176857501,28.213714286)); +#1621=CARTESIAN_POINT('',(18.495184252,-21.071695307,28.127219061)); +#1622=CARTESIAN_POINT('',(18.515361479,-20.966533112,28.040723836)); +#1623=CARTESIAN_POINT('',(18.544059394,-20.858956669,27.959141161)); +#1624=CARTESIAN_POINT('',(18.578285047,-20.751539807,27.883825611)); +#1625=CARTESIAN_POINT('',(18.646736354,-20.536706083,27.733194511)); +#1626=CARTESIAN_POINT('',(18.735522167,-20.323829754,27.607612066)); +#1627=CARTESIAN_POINT('',(18.831556131,-20.107948824,27.500244622)); +#1628=CARTESIAN_POINT('',(18.927590094,-19.892067895,27.392877177)); +#1629=CARTESIAN_POINT('',(19.028810773,-19.678600773,27.306596908)); +#1630=CARTESIAN_POINT('',(19.129191707,-19.463784565,27.238152691)); +#1631=CARTESIAN_POINT('',(19.22957264,-19.248968357,27.169708475)); +#1632=CARTESIAN_POINT('',(19.329361102,-19.032957419,27.1192346)); +#1633=CARTESIAN_POINT('',(19.424865983,-18.813301404,27.087969303)); +#1634=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1618,#1619,#1620,#1621,#1622,#1623,#1624,#1625,#1626,#1627,#1628,#1629,#1630,#1631,#1632,#1633),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,4),(0.,0.000415404,0.000830808,0.001661615,0.002492423,0.003323231),.UNSPECIFIED.); +#1635=EDGE_CURVE('',#835,#1617,#1634,.T.); +#1636=ORIENTED_EDGE('',*,*,#1635,.T.); +#1637=CARTESIAN_POINT('',(17.,-15.854009142,26.666750919)); +#1638=DIRECTION('',(0.,0.140917209,0.990021384)); +#1639=DIRECTION('',(0.,-0.990021384,0.140917209)); +#1640=AXIS2_PLACEMENT_3D('',#1637,#1638,#1639); +#1641=ELLIPSE('',#1640,5.076746801,3.); +#1642=EDGE_CURVE('',#1617,#35,#1641,.T.); +#1643=ORIENTED_EDGE('',*,*,#1642,.T.); +#1644=ORIENTED_EDGE('',*,*,#40,.F.); +#1645=CARTESIAN_POINT('',(17.,2.384358327,8.853797026)); +#1646=DIRECTION('',(0.,0.715400991,-0.69871412)); +#1647=DIRECTION('',(0.,0.69871412,0.715400991)); +#1648=AXIS2_PLACEMENT_3D('',#1645,#1646,#1647); +#1649=CIRCLE('',#1648,3.); +#1650=EDGE_CURVE('',#33,#622,#1649,.T.); +#1651=ORIENTED_EDGE('',*,*,#1650,.T.); +#1652=ORIENTED_EDGE('',*,*,#627,.F.); +#1653=EDGE_LOOP('',(#1615,#1636,#1643,#1644,#1651,#1652)); +#1654=FACE_BOUND('',#1653,.T.); +#1655=ADVANCED_FACE('',(#1654),#1614,.F.); +#1656=CARTESIAN_POINT('',(-17.,62.,8.)); +#1657=DIRECTION('',(0.,-1.,0.)); +#1658=DIRECTION('',(0.,0.,-1.)); +#1659=AXIS2_PLACEMENT_3D('',#1656,#1657,#1658); +#1660=CYLINDRICAL_SURFACE('',#1659,3.); +#1661=ORIENTED_EDGE('',*,*,#196,.F.); +#1662=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#1663=CARTESIAN_POINT('',(-17.174762593,41.264175045,5.)); +#1664=CARTESIAN_POINT('',(-17.349731543,40.669551542,5.01530522)); +#1665=CARTESIAN_POINT('',(-17.522276087,40.077179202,5.045811839)); +#1666=CARTESIAN_POINT('',(-17.69482063,39.484806861,5.076318457)); +#1667=CARTESIAN_POINT('',(-17.864796834,38.895464433,5.121923933)); +#1668=CARTESIAN_POINT('',(-18.030668408,38.308431462,5.182603572)); +#1669=CARTESIAN_POINT('',(-18.362411557,37.134365521,5.303962851)); +#1670=CARTESIAN_POINT('',(-18.678216116,35.969634528,5.485162143)); +#1671=CARTESIAN_POINT('',(-18.962087494,34.808043146,5.730592001)); +#1672=CARTESIAN_POINT('',(-19.104023183,34.227247455,5.85330693)); +#1673=CARTESIAN_POINT('',(-19.237895893,33.647232809,5.99218356)); +#1674=CARTESIAN_POINT('',(-19.36054821,33.066901538,6.14856484)); +#1675=CARTESIAN_POINT('',(-19.421874368,32.776735903,6.22675548)); +#1676=CARTESIAN_POINT('',(-19.480452904,32.486095069,6.309485069)); +#1677=CARTESIAN_POINT('',(-19.535187483,32.197867633,6.395997372)); +#1678=CARTESIAN_POINT('',(-19.589922062,31.909640198,6.482509675)); +#1679=CARTESIAN_POINT('',(-19.640950142,31.62323173,6.572941307)); +#1680=CARTESIAN_POINT('',(-19.687779608,31.338588247,6.66739324)); +#1681=CARTESIAN_POINT('',(-19.781438541,30.769301281,6.856297106)); +#1682=CARTESIAN_POINT('',(-19.858442583,30.207052357,7.061155477)); +#1683=CARTESIAN_POINT('',(-19.91301952,29.65119305,7.282840831)); +#1684=CARTESIAN_POINT('',(-19.967596458,29.095333744,7.504526185)); +#1685=CARTESIAN_POINT('',(-20.,28.54589502,7.74300389)); +#1686=CARTESIAN_POINT('',(-20.,28.001846852,8.)); +#1687=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1662,#1663,#1664,#1665,#1666,#1667,#1668,#1669,#1670,#1671,#1672,#1673,#1674,#1675,#1676,#1677,#1678,#1679,#1680,#1681,#1682,#1683,#1684,#1685,#1686),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.007599542,0.009499427,0.01044937,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.); +#1688=EDGE_CURVE('',#189,#102,#1687,.T.); +#1689=ORIENTED_EDGE('',*,*,#1688,.T.); +#1690=ORIENTED_EDGE('',*,*,#107,.F.); +#1691=CARTESIAN_POINT('',(-17.,4.480500687,8.)); +#1692=DIRECTION('',(0.,-1.,0.)); +#1693=DIRECTION('',(0.,0.,-1.)); +#1694=AXIS2_PLACEMENT_3D('',#1691,#1692,#1693); +#1695=CIRCLE('',#1694,3.); +#1696=EDGE_CURVE('',#100,#191,#1695,.T.); +#1697=ORIENTED_EDGE('',*,*,#1696,.T.); +#1698=EDGE_LOOP('',(#1661,#1689,#1690,#1697)); +#1699=FACE_BOUND('',#1698,.T.); +#1700=ADVANCED_FACE('',(#1699),#1660,.F.); +#1701=CARTESIAN_POINT('',(-17.,5.58971296,5.723207931)); +#1702=DIRECTION('',(0.,0.715400991,-0.69871412)); +#1703=DIRECTION('',(0.,0.69871412,0.715400991)); +#1704=AXIS2_PLACEMENT_3D('',#1701,#1702,#1703); +#1705=CYLINDRICAL_SURFACE('',#1704,3.); +#1706=CARTESIAN_POINT('',(-19.424865983,-18.813301404,27.087969303)); +#1707=VERTEX_POINT('',#1706); +#1708=CARTESIAN_POINT('',(-17.,-15.854009142,26.666750919)); +#1709=DIRECTION('',(0.,0.140917209,0.990021384)); +#1710=DIRECTION('',(0.,0.990021384,-0.140917209)); +#1711=AXIS2_PLACEMENT_3D('',#1708,#1709,#1710); +#1712=ELLIPSE('',#1711,5.076746801,3.); +#1713=EDGE_CURVE('',#136,#1707,#1712,.T.); +#1714=ORIENTED_EDGE('',*,*,#1713,.T.); +#1715=CARTESIAN_POINT('',(-19.424865983,-18.813301404,27.087969303)); +#1716=CARTESIAN_POINT('',(-19.329361102,-19.032957419,27.1192346)); +#1717=CARTESIAN_POINT('',(-19.22957264,-19.248968357,27.169708475)); +#1718=CARTESIAN_POINT('',(-19.129191707,-19.463784565,27.238152691)); +#1719=CARTESIAN_POINT('',(-19.028810773,-19.678600773,27.306596908)); +#1720=CARTESIAN_POINT('',(-18.927590094,-19.892067895,27.392877177)); +#1721=CARTESIAN_POINT('',(-18.831556131,-20.107948824,27.500244622)); +#1722=CARTESIAN_POINT('',(-18.735522167,-20.323829754,27.607612066)); +#1723=CARTESIAN_POINT('',(-18.646736354,-20.536706083,27.733194511)); +#1724=CARTESIAN_POINT('',(-18.578285047,-20.751539807,27.883825611)); +#1725=CARTESIAN_POINT('',(-18.544059394,-20.858956669,27.959141161)); +#1726=CARTESIAN_POINT('',(-18.515361479,-20.966533112,28.040723836)); +#1727=CARTESIAN_POINT('',(-18.495184252,-21.071695307,28.127219061)); +#1728=CARTESIAN_POINT('',(-18.475007024,-21.176857501,28.213714286)); +#1729=CARTESIAN_POINT('',(-18.463116984,-21.280666691,28.30591146)); +#1730=CARTESIAN_POINT('',(-18.461329278,-21.382228865,28.403710911)); +#1731=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1715,#1716,#1717,#1718,#1719,#1720,#1721,#1722,#1723,#1724,#1725,#1726,#1727,#1728,#1729,#1730),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,4),(-0.,0.000830808,0.001661615,0.002492423,0.002907827,0.003323231),.UNSPECIFIED.); +#1732=EDGE_CURVE('',#1707,#855,#1731,.T.); +#1733=ORIENTED_EDGE('',*,*,#1732,.T.); +#1734=ORIENTED_EDGE('',*,*,#861,.F.); +#1735=ORIENTED_EDGE('',*,*,#643,.F.); +#1736=CARTESIAN_POINT('',(-17.,2.384358327,8.853797026)); +#1737=DIRECTION('',(0.,0.715400991,-0.69871412)); +#1738=DIRECTION('',(0.,0.69871412,0.715400991)); +#1739=AXIS2_PLACEMENT_3D('',#1736,#1737,#1738); +#1740=CIRCLE('',#1739,3.); +#1741=EDGE_CURVE('',#630,#144,#1740,.T.); +#1742=ORIENTED_EDGE('',*,*,#1741,.T.); +#1743=ORIENTED_EDGE('',*,*,#149,.F.); +#1744=EDGE_LOOP('',(#1714,#1733,#1734,#1735,#1742,#1743)); +#1745=FACE_BOUND('',#1744,.T.); +#1746=ADVANCED_FACE('',(#1745),#1705,.F.); +#1747=CARTESIAN_POINT('',(0.,-19.224694785,30.666750919)); +#1748=DIRECTION('',(1.,0.,0.)); +#1749=DIRECTION('',(0.,0.,-1.)); +#1750=AXIS2_PLACEMENT_3D('',#1747,#1748,#1749); +#1751=CYLINDRICAL_SURFACE('',#1750,3.); +#1752=ORIENTED_EDGE('',*,*,#692,.F.); +#1753=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919)); +#1754=CARTESIAN_POINT('',(20.061469153,-19.477685187,27.666750919)); +#1755=CARTESIAN_POINT('',(19.879189926,-19.720524415,27.697815974)); +#1756=CARTESIAN_POINT('',(19.699098932,-19.958858558,27.757970495)); +#1757=CARTESIAN_POINT('',(19.519007937,-20.1971927,27.818125016)); +#1758=CARTESIAN_POINT('',(19.337980773,-20.43278664,27.908411883)); +#1759=CARTESIAN_POINT('',(19.194638955,-20.661564532,28.033235146)); +#1760=CARTESIAN_POINT('',(19.122968046,-20.775953478,28.095646777)); +#1761=CARTESIAN_POINT('',(19.060327383,-20.890470923,28.167948847)); +#1762=CARTESIAN_POINT('',(19.016626246,-21.001028793,28.249182411)); +#1763=CARTESIAN_POINT('',(18.972925108,-21.111586663,28.330415974)); +#1764=CARTESIAN_POINT('',(18.948132009,-21.219184631,28.421263027)); +#1765=CARTESIAN_POINT('',(18.948138016,-21.320876435,28.520586319)); +#1766=CARTESIAN_POINT('',(18.948144024,-21.422568239,28.619909611)); +#1767=CARTESIAN_POINT('',(18.972619847,-21.514983626,28.72419078)); +#1768=CARTESIAN_POINT('',(19.016408724,-21.599157159,28.833194691)); +#1769=CARTESIAN_POINT('',(19.038303163,-21.641243926,28.887696647)); +#1770=CARTESIAN_POINT('',(19.06509424,-21.681237264,28.943420254)); +#1771=CARTESIAN_POINT('',(19.095021711,-21.718432387,28.999036076)); +#1772=CARTESIAN_POINT('',(19.124949183,-21.755627509,29.054651897)); +#1773=CARTESIAN_POINT('',(19.158098122,-21.790309918,29.110526682)); +#1774=CARTESIAN_POINT('',(19.193758876,-21.822770996,29.166750918)); +#1775=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1753,#1754,#1755,#1756,#1757,#1758,#1759,#1760,#1761,#1762,#1763,#1764,#1765,#1766,#1767,#1768,#1769,#1770,#1771,#1772,#1773,#1774),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,4),(0.,0.001120134,0.002240267,0.002800334,0.003360401,0.003920467,0.004200501,0.004480534),.UNSPECIFIED.); +#1776=EDGE_CURVE('',#678,#827,#1775,.T.); +#1777=ORIENTED_EDGE('',*,*,#1776,.T.); +#1778=ORIENTED_EDGE('',*,*,#832,.F.); +#1779=CARTESIAN_POINT('',(23.5,-19.224694785,30.666750919)); +#1780=DIRECTION('',(1.,0.,0.)); +#1781=DIRECTION('',(0.,0.,-1.)); +#1782=AXIS2_PLACEMENT_3D('',#1779,#1780,#1781); +#1783=CIRCLE('',#1782,3.); +#1784=EDGE_CURVE('',#815,#687,#1783,.T.); +#1785=ORIENTED_EDGE('',*,*,#1784,.T.); +#1786=EDGE_LOOP('',(#1752,#1777,#1778,#1785)); +#1787=FACE_BOUND('',#1786,.T.); +#1788=ADVANCED_FACE('',(#1787),#1751,.F.); +#1789=CARTESIAN_POINT('',(0.,-19.224694785,30.666750919)); +#1790=DIRECTION('',(1.,0.,0.)); +#1791=DIRECTION('',(0.,0.,-1.)); +#1792=AXIS2_PLACEMENT_3D('',#1789,#1790,#1791); +#1793=CYLINDRICAL_SURFACE('',#1792,3.); +#1794=ORIENTED_EDGE('',*,*,#881,.F.); +#1795=CARTESIAN_POINT('',(-19.193758876,-21.822770996,29.166750918)); +#1796=CARTESIAN_POINT('',(-19.158098122,-21.790309918,29.110526682)); +#1797=CARTESIAN_POINT('',(-19.124949183,-21.755627509,29.054651897)); +#1798=CARTESIAN_POINT('',(-19.095021711,-21.718432387,28.999036076)); +#1799=CARTESIAN_POINT('',(-19.06509424,-21.681237264,28.943420254)); +#1800=CARTESIAN_POINT('',(-19.038303163,-21.641243926,28.887696647)); +#1801=CARTESIAN_POINT('',(-19.016408724,-21.599157159,28.833194691)); +#1802=CARTESIAN_POINT('',(-18.972619847,-21.514983626,28.72419078)); +#1803=CARTESIAN_POINT('',(-18.948144024,-21.422568239,28.619909611)); +#1804=CARTESIAN_POINT('',(-18.948138016,-21.320876435,28.520586319)); +#1805=CARTESIAN_POINT('',(-18.948132009,-21.219184631,28.421263027)); +#1806=CARTESIAN_POINT('',(-18.972925108,-21.111586663,28.330415974)); +#1807=CARTESIAN_POINT('',(-19.016626246,-21.001028793,28.249182411)); +#1808=CARTESIAN_POINT('',(-19.060327383,-20.890470923,28.167948847)); +#1809=CARTESIAN_POINT('',(-19.122968046,-20.775953478,28.095646777)); +#1810=CARTESIAN_POINT('',(-19.194638955,-20.661564532,28.033235146)); +#1811=CARTESIAN_POINT('',(-19.337980773,-20.43278664,27.908411883)); +#1812=CARTESIAN_POINT('',(-19.519007937,-20.1971927,27.818125016)); +#1813=CARTESIAN_POINT('',(-19.699098932,-19.958858558,27.757970495)); +#1814=CARTESIAN_POINT('',(-19.879189926,-19.720524415,27.697815974)); +#1815=CARTESIAN_POINT('',(-20.061469153,-19.477685187,27.666750919)); +#1816=CARTESIAN_POINT('',(-20.233154644,-19.224694785,27.666750919)); +#1817=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1795,#1796,#1797,#1798,#1799,#1800,#1801,#1802,#1803,#1804,#1805,#1806,#1807,#1808,#1809,#1810,#1811,#1812,#1813,#1814,#1815,#1816),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,4),(-0.,0.000280033,0.000560067,0.001120134,0.0016802,0.002240267,0.003360401,0.004480534),.UNSPECIFIED.); +#1818=EDGE_CURVE('',#864,#962,#1817,.T.); +#1819=ORIENTED_EDGE('',*,*,#1818,.T.); +#1820=ORIENTED_EDGE('',*,*,#1000,.F.); +#1821=CARTESIAN_POINT('',(-23.5,-19.224694785,30.666750919)); +#1822=DIRECTION('',(-1.,0.,0.)); +#1823=DIRECTION('',(0.,0.,1.)); +#1824=AXIS2_PLACEMENT_3D('',#1821,#1822,#1823); +#1825=CIRCLE('',#1824,3.); +#1826=EDGE_CURVE('',#989,#876,#1825,.T.); +#1827=ORIENTED_EDGE('',*,*,#1826,.T.); +#1828=EDGE_LOOP('',(#1794,#1819,#1820,#1827)); +#1829=FACE_BOUND('',#1828,.T.); +#1830=ADVANCED_FACE('',(#1829),#1793,.F.); +#1831=CARTESIAN_POINT('',(-35.,-25.004809472,44.67820323)); +#1832=DIRECTION('',(0.,-0.866025404,-0.5)); +#1833=DIRECTION('',(0.,0.5,-0.866025404)); +#1834=AXIS2_PLACEMENT_3D('',#1831,#1832,#1833); +#1835=CYLINDRICAL_SURFACE('',#1834,2.); +#1836=ORIENTED_EDGE('',*,*,#1285,.F.); +#1837=CARTESIAN_POINT('',(-35.,-31.066987298,41.17820323)); +#1838=DIRECTION('',(-0.196116135,-0.849207776,-0.490290338)); +#1839=DIRECTION('',(-0.980580676,0.169841555,0.098058068)); +#1840=AXIS2_PLACEMENT_3D('',#1837,#1838,#1839); +#1841=ELLIPSE('',#1840,2.039607805,2.); +#1842=EDGE_CURVE('',#1274,#1234,#1841,.T.); +#1843=ORIENTED_EDGE('',*,*,#1842,.T.); +#1844=ORIENTED_EDGE('',*,*,#1239,.F.); +#1845=ORIENTED_EDGE('',*,*,#1189,.F.); +#1846=EDGE_LOOP('',(#1836,#1843,#1844,#1845)); +#1847=FACE_BOUND('',#1846,.T.); +#1848=ADVANCED_FACE('',(#1847),#1835,.T.); +#1849=CARTESIAN_POINT('',(31.,-25.004809472,44.67820323)); +#1850=DIRECTION('',(0.,-0.866025404,-0.5)); +#1851=DIRECTION('',(0.,0.5,-0.866025404)); +#1852=AXIS2_PLACEMENT_3D('',#1849,#1850,#1851); +#1853=CYLINDRICAL_SURFACE('',#1852,2.); +#1854=ORIENTED_EDGE('',*,*,#1174,.F.); +#1855=ORIENTED_EDGE('',*,*,#1300,.F.); +#1856=CARTESIAN_POINT('',(32.,-31.066987298,43.17820323)); +#1857=VERTEX_POINT('',#1856); +#1858=CARTESIAN_POINT('',(31.,-31.066987298,41.17820323)); +#1859=DIRECTION('',(-0.707106781,0.612372436,0.353553391)); +#1860=DIRECTION('',(-0.707106781,-0.612372436,-0.353553391)); +#1861=AXIS2_PLACEMENT_3D('',#1858,#1859,#1860); +#1862=ELLIPSE('',#1861,2.828427125,2.); +#1863=EDGE_CURVE('',#1857,#784,#1862,.T.); +#1864=ORIENTED_EDGE('',*,*,#1863,.F.); +#1865=CARTESIAN_POINT('',(31.,-31.066987298,41.17820323)); +#1866=DIRECTION('',(-0.707106781,0.612372436,0.353553391)); +#1867=DIRECTION('',(-0.707106781,-0.612372436,-0.353553391)); +#1868=AXIS2_PLACEMENT_3D('',#1865,#1866,#1867); +#1869=ELLIPSE('',#1868,2.828427125,2.); +#1870=EDGE_CURVE('',#1266,#1857,#1869,.T.); +#1871=ORIENTED_EDGE('',*,*,#1870,.F.); +#1872=ORIENTED_EDGE('',*,*,#1271,.F.); +#1873=EDGE_LOOP('',(#1854,#1855,#1864,#1871,#1872)); +#1874=FACE_BOUND('',#1873,.T.); +#1875=ADVANCED_FACE('',(#1874),#1853,.T.); +#1876=CARTESIAN_POINT('',(0.,-31.066987298,41.17820323)); +#1877=DIRECTION('',(-1.,0.,0.)); +#1878=DIRECTION('',(0.,0.,1.)); +#1879=AXIS2_PLACEMENT_3D('',#1876,#1877,#1878); +#1880=CYLINDRICAL_SURFACE('',#1879,2.); +#1881=CARTESIAN_POINT('',(-35.2,-31.066987298,43.17820323)); +#1882=VERTEX_POINT('',#1881); +#1883=CARTESIAN_POINT('',(-35.2,-31.066987298,43.17820323)); +#1884=DIRECTION('',(1.,-0.,-0.)); +#1885=VECTOR('',#1884,67.2); +#1886=LINE('',#1883,#1885); +#1887=EDGE_CURVE('',#1882,#1857,#1886,.T.); +#1888=ORIENTED_EDGE('',*,*,#1887,.T.); +#1889=ORIENTED_EDGE('',*,*,#1863,.T.); +#1890=ORIENTED_EDGE('',*,*,#789,.F.); +#1891=CARTESIAN_POINT('',(-35.,-31.066987298,41.17820323)); +#1892=DIRECTION('',(0.980580676,0.169841555,0.098058068)); +#1893=DIRECTION('',(-0.196116135,0.849207776,0.490290338)); +#1894=AXIS2_PLACEMENT_3D('',#1891,#1892,#1893); +#1895=ELLIPSE('',#1894,2.039607805,2.); +#1896=EDGE_CURVE('',#776,#1882,#1895,.T.); +#1897=ORIENTED_EDGE('',*,*,#1896,.T.); +#1898=EDGE_LOOP('',(#1888,#1889,#1890,#1897)); +#1899=FACE_BOUND('',#1898,.T.); +#1900=ADVANCED_FACE('',(#1899),#1880,.T.); +#1901=CARTESIAN_POINT('',(0.,2.036591221,5.)); +#1902=DIRECTION('',(-1.,0.,0.)); +#1903=DIRECTION('',(0.,0.,1.)); +#1904=AXIS2_PLACEMENT_3D('',#1901,#1902,#1903); +#1905=CYLINDRICAL_SURFACE('',#1904,5.); +#1906=ORIENTED_EDGE('',*,*,#1376,.F.); +#1907=ORIENTED_EDGE('',*,*,#1403,.F.); +#1908=ORIENTED_EDGE('',*,*,#1320,.F.); +#1909=ORIENTED_EDGE('',*,*,#444,.F.); +#1910=ORIENTED_EDGE('',*,*,#512,.F.); +#1911=ORIENTED_EDGE('',*,*,#302,.F.); +#1912=EDGE_LOOP('',(#1906,#1907,#1908,#1909,#1910,#1911)); +#1913=FACE_BOUND('',#1912,.T.); +#1914=ADVANCED_FACE('',(#1913),#1905,.T.); +#1915=CARTESIAN_POINT('',(-34.999994244,-32.067012223,42.910239647)); +#1916=CARTESIAN_POINT('',(-34.999994244,-32.067012223,42.910239647)); +#1917=CARTESIAN_POINT('',(-34.999988488,-32.067007238,42.910242525)); +#1918=CARTESIAN_POINT('',(-34.999988488,-32.067007238,42.910242525)); +#1919=CARTESIAN_POINT('',(-34.999982732,-32.067002253,42.910245403)); +#1920=CARTESIAN_POINT('',(-34.999982731,-32.067002253,42.910245404)); +#1921=CARTESIAN_POINT('',(-34.999976975,-32.066997268,42.910248281)); +#1922=CARTESIAN_POINT('',(-34.999976975,-32.066997268,42.910248282)); +#1923=CARTESIAN_POINT('',(-34.999971219,-32.066992283,42.91025116)); +#1924=CARTESIAN_POINT('',(-34.999971219,-32.066992283,42.91025116)); +#1925=CARTESIAN_POINT('',(-34.999996163,-32.067003915,42.910244444)); +#1926=CARTESIAN_POINT('',(-34.999996163,-32.067003915,42.910244444)); +#1927=CARTESIAN_POINT('',(-34.999992325,-32.067000591,42.910246363)); +#1928=CARTESIAN_POINT('',(-34.999992325,-32.067000591,42.910246363)); +#1929=CARTESIAN_POINT('',(-34.999988488,-32.066997268,42.910248282)); +#1930=CARTESIAN_POINT('',(-34.999988488,-32.066997268,42.910248282)); +#1931=CARTESIAN_POINT('',(-34.99998465,-32.066993945,42.9102502)); +#1932=CARTESIAN_POINT('',(-34.99998465,-32.066993945,42.9102502)); +#1933=CARTESIAN_POINT('',(-34.999980813,-32.066990621,42.910252119)); +#1934=CARTESIAN_POINT('',(-34.999980813,-32.066990621,42.910252119)); +#1935=CARTESIAN_POINT('',(-34.999998081,-32.066995606,42.910249241)); +#1936=CARTESIAN_POINT('',(-34.999998081,-32.066995606,42.910249241)); +#1937=CARTESIAN_POINT('',(-34.999996163,-32.066993945,42.9102502)); +#1938=CARTESIAN_POINT('',(-34.999996163,-32.066993945,42.9102502)); +#1939=CARTESIAN_POINT('',(-34.999994244,-32.066992283,42.91025116)); +#1940=CARTESIAN_POINT('',(-34.999994244,-32.066992283,42.91025116)); +#1941=CARTESIAN_POINT('',(-34.999992325,-32.066990621,42.910252119)); +#1942=CARTESIAN_POINT('',(-34.999992325,-32.066990621,42.910252119)); +#1943=CARTESIAN_POINT('',(-34.999990406,-32.06698896,42.910253078)); +#1944=CARTESIAN_POINT('',(-34.999990406,-32.06698896,42.910253078)); +#1945=CARTESIAN_POINT('',(-35.052359878,-31.840262378,43.041153732)); +#1946=CARTESIAN_POINT('',(-35.052359878,-31.840262378,43.041153732)); +#1947=CARTESIAN_POINT('',(-35.104719755,-31.885607362,43.014973793)); +#1948=CARTESIAN_POINT('',(-35.104719755,-31.885607362,43.014973793)); +#1949=CARTESIAN_POINT('',(-35.157079633,-31.930952346,42.988793854)); +#1950=CARTESIAN_POINT('',(-35.157079633,-31.930952346,42.988793854)); +#1951=CARTESIAN_POINT('',(-35.20943951,-31.97629733,42.962613915)); +#1952=CARTESIAN_POINT('',(-35.20943951,-31.97629733,42.962613915)); +#1953=CARTESIAN_POINT('',(-35.261799388,-32.021642314,42.936433977)); +#1954=CARTESIAN_POINT('',(-35.261799388,-32.021642314,42.936433977)); +#1955=CARTESIAN_POINT('',(-35.104699154,-31.58759934,43.126921276)); +#1956=CARTESIAN_POINT('',(-35.139631297,-31.621414668,43.11592267)); +#1957=CARTESIAN_POINT('',(-35.174563644,-31.654350079,43.103266863)); +#1958=CARTESIAN_POINT('',(-35.244424387,-31.718431595,43.074739264)); +#1959=CARTESIAN_POINT('',(-35.279353181,-31.749578045,43.058867391)); +#1960=CARTESIAN_POINT('',(-35.349191153,-31.810059503,43.023948405)); +#1961=CARTESIAN_POINT('',(-35.384100707,-31.839394836,43.004901104)); +#1962=CARTESIAN_POINT('',(-35.453860727,-31.896228448,42.963618321)); +#1963=CARTESIAN_POINT('',(-35.488711533,-31.92372702,42.941382552)); +#1964=CARTESIAN_POINT('',(-35.523495769,-31.950287848,42.917522968)); +#1965=CARTESIAN_POINT('',(-35.201447592,-31.068480025,43.19526463)); +#1966=CARTESIAN_POINT('',(-35.273857342,-31.132987254,43.193318826)); +#1967=CARTESIAN_POINT('',(-35.34626626,-31.197065064,43.183089278)); +#1968=CARTESIAN_POINT('',(-35.489077546,-31.322575396,43.146392649)); +#1969=CARTESIAN_POINT('',(-35.559478268,-31.384006463,43.119926033)); +#1970=CARTESIAN_POINT('',(-35.696314751,-31.502510333,43.051507791)); +#1971=CARTESIAN_POINT('',(-35.762748924,-31.559581762,43.009556961)); +#1972=CARTESIAN_POINT('',(-35.889792374,-31.667772486,42.91132622)); +#1973=CARTESIAN_POINT('',(-35.950400159,-31.71889052,42.855047418)); +#1974=CARTESIAN_POINT('',(-36.007237961,-31.766314954,42.792369446)); +#1975=CARTESIAN_POINT('',(-35.245818688,-30.802227998,43.17781355)); +#1976=CARTESIAN_POINT('',(-35.338393614,-30.878381671,43.187294365)); +#1977=CARTESIAN_POINT('',(-35.430966443,-30.955585135,43.183552206)); +#1978=CARTESIAN_POINT('',(-35.612037421,-31.108455583,43.149936067)); +#1979=CARTESIAN_POINT('',(-35.700531345,-31.184118244,43.120063383)); +#1980=CARTESIAN_POINT('',(-35.869491702,-31.330442205,43.035583205)); +#1981=CARTESIAN_POINT('',(-35.949953831,-31.401099778,42.980977862)); +#1982=CARTESIAN_POINT('',(-36.099151591,-31.534250448,42.849459632)); +#1983=CARTESIAN_POINT('',(-36.167882832,-31.596740406,42.772549756)); +#1984=CARTESIAN_POINT('',(-36.22909344,-31.653768912,42.686176174)); +#1985=CARTESIAN_POINT('',(-35.319866737,-30.296470418,43.042296215)); +#1986=CARTESIAN_POINT('',(-35.45530067,-30.376049692,43.074543918)); +#1987=CARTESIAN_POINT('',(-35.590718906,-30.464081583,43.08450251)); +#1988=CARTESIAN_POINT('',(-35.850127219,-30.649476851,43.059105614)); +#1989=CARTESIAN_POINT('',(-35.974087145,-30.746818152,43.023753435)); +#1990=CARTESIAN_POINT('',(-36.200049717,-30.942507479,42.910772149)); +#1991=CARTESIAN_POINT('',(-36.302025846,-31.040832541,42.8331563)); +#1992=CARTESIAN_POINT('',(-36.475281305,-31.230135092,42.64222131)); +#1993=CARTESIAN_POINT('',(-36.546539863,-31.321090555,42.528924321)); +#1994=CARTESIAN_POINT('',(-36.599333685,-31.404521298,42.402562741)); +#1995=CARTESIAN_POINT('',(-35.349514555,-30.057163859,42.92428328)); +#1996=CARTESIAN_POINT('',(-35.5080088,-30.12770136,42.967213485)); +#1997=CARTESIAN_POINT('',(-35.66647325,-30.212702129,42.983925691)); +#1998=CARTESIAN_POINT('',(-35.966481708,-30.402257508,42.963063975)); +#1999=CARTESIAN_POINT('',(-36.107969094,-30.506774352,42.92549368)); +#2000=CARTESIAN_POINT('',(-36.358803868,-30.724003638,42.800076293)); +#2001=CARTESIAN_POINT('',(-36.468103257,-30.836674512,42.7122532)); +#2002=CARTESIAN_POINT('',(-36.642693889,-31.058134002,42.495815372)); +#2003=CARTESIAN_POINT('',(-36.707950611,-31.166881452,42.367242579)); +#2004=CARTESIAN_POINT('',(-36.747572777,-31.267917795,42.22525417)); +#2005=CARTESIAN_POINT('',(-35.389589071,-29.641765021,42.605536541)); +#2006=CARTESIAN_POINT('',(-35.585701782,-29.67888732,42.645216606)); +#2007=CARTESIAN_POINT('',(-35.781749979,-29.743083982,42.656922488)); +#2008=CARTESIAN_POINT('',(-36.146497659,-29.916447339,42.622702478)); +#2009=CARTESIAN_POINT('',(-36.31507697,-30.02555528,42.576787607)); +#2010=CARTESIAN_POINT('',(-36.601198773,-30.27334403,42.433726705)); +#2011=CARTESIAN_POINT('',(-36.718646456,-30.411942732,42.336628079)); +#2012=CARTESIAN_POINT('',(-36.885893533,-30.699300349,42.104850711)); +#2013=CARTESIAN_POINT('',(-36.935636532,-30.847965107,41.970249231)); +#2014=CARTESIAN_POINT('',(-36.947945353,-30.99134115,41.8263584)); +#2015=CARTESIAN_POINT('',(-35.4,-29.465836184,42.404928151)); +#2016=CARTESIAN_POINT('',(-35.60943951,-29.479543968,42.428670729)); +#2017=CARTESIAN_POINT('',(-35.818796615,-29.526585301,42.426861273)); +#2018=CARTESIAN_POINT('',(-36.205790369,-29.680244693,42.372411023)); +#2019=CARTESIAN_POINT('',(-36.383274752,-29.786802293,42.319791654)); +#2020=CARTESIAN_POINT('',(-36.679466948,-30.043312259,42.171695556)); +#2021=CARTESIAN_POINT('',(-36.798058221,-30.193163699,42.076277097)); +#2022=CARTESIAN_POINT('',(-36.958356283,-30.513472922,41.857081439)); +#2023=CARTESIAN_POINT('',(-37.,-30.683804678,41.733390484)); +#2024=CARTESIAN_POINT('',(-37.,-30.85147683,41.604928151)); +#2025=CARTESIAN_POINT('',(-35.4,-29.334936491,42.17820323)); +#2026=CARTESIAN_POINT('',(-35.60943951,-29.334936491,42.17820323)); +#2027=CARTESIAN_POINT('',(-35.818796615,-29.371001008,42.157381372)); +#2028=CARTESIAN_POINT('',(-36.205790369,-29.509823201,42.077232341)); +#2029=CARTESIAN_POINT('',(-36.383274752,-29.612526256,42.017936704)); +#2030=CARTESIAN_POINT('',(-36.679466948,-29.869036222,41.869840606)); +#2031=CARTESIAN_POINT('',(-36.798058221,-30.022742207,41.781098415)); +#2032=CARTESIAN_POINT('',(-36.958356283,-30.357888629,41.587601538)); +#2033=CARTESIAN_POINT('',(-37.,-30.5391972,41.482922985)); +#2034=CARTESIAN_POINT('',(-37.,-30.720577137,41.37820323)); +#2035=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#1915,#1916,#1917,#1918,#1919,#1920,#1921,#1922,#1923,#1924),(#1925,#1926,#1927,#1928,#1929,#1930,#1931,#1932,#1933,#1934),(#1935,#1936,#1937,#1938,#1939,#1940,#1941,#1942,#1943,#1944),(#1945,#1946,#1947,#1948,#1949,#1950,#1951,#1952,#1953,#1954),(#1955,#1956,#1957,#1958,#1959,#1960,#1961,#1962,#1963,#1964),(#1965,#1966,#1967,#1968,#1969,#1970,#1971,#1972,#1973,#1974),(#1975,#1976,#1977,#1978,#1979,#1980,#1981,#1982,#1983,#1984),(#1985,#1986,#1987,#1988,#1989,#1990,#1991,#1992,#1993,#1994),(#1995,#1996,#1997,#1998,#1999,#2000,#2001,#2002,#2003,#2004),(#2005,#2006,#2007,#2008,#2009,#2010,#2011,#2012,#2013,#2014),(#2015,#2016,#2017,#2018,#2019,#2020,#2021,#2022,#2023,#2024),(#2025,#2026,#2027,#2028,#2029,#2030,#2031,#2032,#2033,#2034)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,4),(4,2,2,2,4),(4.71237459,4.71238898,5.105088062,5.497787144,5.890486225,6.283185307),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#2036=ORIENTED_EDGE('',*,*,#1842,.F.); +#2037=CARTESIAN_POINT('',(-35.,-31.066987298,41.17820323)); +#2038=DIRECTION('',(0.980580676,0.169841555,0.098058068)); +#2039=DIRECTION('',(-0.196116135,0.849207776,0.490290338)); +#2040=AXIS2_PLACEMENT_3D('',#2037,#2038,#2039); +#2041=ELLIPSE('',#2040,2.039607805,2.); +#2042=EDGE_CURVE('',#1882,#1274,#2041,.T.); +#2043=ORIENTED_EDGE('',*,*,#2042,.F.); +#2044=ORIENTED_EDGE('',*,*,#1896,.F.); +#2045=CARTESIAN_POINT('',(-35.4,-30.720577137,41.37820323)); +#2046=DIRECTION('',(-0.,0.5,-0.866025404)); +#2047=DIRECTION('',(0.,0.866025404,0.5)); +#2048=AXIS2_PLACEMENT_3D('',#2045,#2046,#2047); +#2049=CIRCLE('',#2048,1.6); +#2050=EDGE_CURVE('',#1234,#776,#2049,.T.); +#2051=ORIENTED_EDGE('',*,*,#2050,.F.); +#2052=EDGE_LOOP('',(#2036,#2043,#2044,#2051)); +#2053=FACE_BOUND('',#2052,.T.); +#2054=ADVANCED_FACE('',(#2053),#2035,.T.); +#2055=CARTESIAN_POINT('',(-35.4,-9.720577137,5.005136271)); +#2056=DIRECTION('',(0.,0.5,-0.866025404)); +#2057=DIRECTION('',(0.,0.866025404,0.5)); +#2058=AXIS2_PLACEMENT_3D('',#2055,#2056,#2057); +#2059=CYLINDRICAL_SURFACE('',#2058,1.6); +#2060=ORIENTED_EDGE('',*,*,#2050,.T.); +#2061=ORIENTED_EDGE('',*,*,#781,.F.); +#2062=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608)); +#2063=DIRECTION('',(0.,0.5,-0.866025404)); +#2064=DIRECTION('',(0.,0.866025404,0.5)); +#2065=AXIS2_PLACEMENT_3D('',#2062,#2063,#2064); +#2066=CIRCLE('',#2065,1.6); +#2067=EDGE_CURVE('',#1242,#768,#2066,.T.); +#2068=ORIENTED_EDGE('',*,*,#2067,.F.); +#2069=ORIENTED_EDGE('',*,*,#1247,.F.); +#2070=EDGE_LOOP('',(#2060,#2061,#2068,#2069)); +#2071=FACE_BOUND('',#2070,.T.); +#2072=ADVANCED_FACE('',(#2071),#2059,.T.); +#2073=CARTESIAN_POINT('',(-35.4,-25.465063509,25.475386608)); +#2074=DIRECTION('',(0.,-0.866025404,-0.5)); +#2075=DIRECTION('',(0.,0.5,-0.866025404)); +#2076=AXIS2_PLACEMENT_3D('',#2073,#2074,#2075); +#2077=CYLINDRICAL_SURFACE('',#2076,1.6); +#2078=ORIENTED_EDGE('',*,*,#1143,.F.); +#2079=ORIENTED_EDGE('',*,*,#1253,.F.); +#2080=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608)); +#2081=DIRECTION('',(-0.,0.866025404,0.5)); +#2082=DIRECTION('',(0.,0.5,-0.866025404)); +#2083=AXIS2_PLACEMENT_3D('',#2080,#2081,#2082); +#2084=CIRCLE('',#2083,1.6); +#2085=EDGE_CURVE('',#1203,#1242,#2084,.T.); +#2086=ORIENTED_EDGE('',*,*,#2085,.F.); +#2087=ORIENTED_EDGE('',*,*,#1223,.F.); +#2088=EDGE_LOOP('',(#2078,#2079,#2086,#2087)); +#2089=FACE_BOUND('',#2088,.T.); +#2090=ADVANCED_FACE('',(#2089),#2077,.T.); +#2091=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608)); +#2092=DIRECTION('',(0.,0.,1.)); +#2093=DIRECTION('',(1.,0.,-0.)); +#2094=AXIS2_PLACEMENT_3D('',#2091,#2092,#2093); +#2095=SPHERICAL_SURFACE('',#2094,1.6); +#2096=ORIENTED_EDGE('',*,*,#2085,.T.); +#2097=ORIENTED_EDGE('',*,*,#2067,.T.); +#2098=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608)); +#2099=DIRECTION('',(1.,0.,0.)); +#2100=DIRECTION('',(0.,0.,-1.)); +#2101=AXIS2_PLACEMENT_3D('',#2098,#2099,#2100); +#2102=CIRCLE('',#2101,1.6); +#2103=EDGE_CURVE('',#1203,#768,#2102,.T.); +#2104=ORIENTED_EDGE('',*,*,#2103,.F.); +#2105=EDGE_LOOP('',(#2096,#2097,#2104)); +#2106=FACE_BOUND('',#2105,.T.); +#2107=ADVANCED_FACE('',(#2106),#2095,.T.); +#2108=CARTESIAN_POINT('',(0.,-22.520577137,27.175386608)); +#2109=DIRECTION('',(1.,0.,0.)); +#2110=DIRECTION('',(0.,0.,-1.)); +#2111=AXIS2_PLACEMENT_3D('',#2108,#2109,#2110); +#2112=CYLINDRICAL_SURFACE('',#2111,1.6); +#2113=ORIENTED_EDGE('',*,*,#2103,.T.); +#2114=ORIENTED_EDGE('',*,*,#773,.F.); +#2115=CARTESIAN_POINT('',(-34.044273436,-21.37593555,26.057444016)); +#2116=VERTEX_POINT('',#2115); +#2117=CARTESIAN_POINT('',(-34.786791912,-22.520577137,27.175386608)); +#2118=DIRECTION('',(0.907082288,-0.301150443,0.294126049)); +#2119=DIRECTION('',(0.420953349,0.648927568,-0.633791203)); +#2120=AXIS2_PLACEMENT_3D('',#2117,#2118,#2119); +#2121=ELLIPSE('',#2120,1.763897301,1.6); +#2122=EDGE_CURVE('',#2116,#759,#2121,.T.); +#2123=ORIENTED_EDGE('',*,*,#2122,.F.); +#2124=CARTESIAN_POINT('',(-34.786791912,-22.520577137,27.175386608)); +#2125=DIRECTION('',(0.907082288,-0.301150443,0.294126049)); +#2126=DIRECTION('',(0.420953349,0.648927568,-0.633791203)); +#2127=AXIS2_PLACEMENT_3D('',#2124,#2125,#2126); +#2128=ELLIPSE('',#2127,1.763897301,1.6); +#2129=EDGE_CURVE('',#1205,#2116,#2128,.T.); +#2130=ORIENTED_EDGE('',*,*,#2129,.F.); +#2131=ORIENTED_EDGE('',*,*,#1210,.F.); +#2132=EDGE_LOOP('',(#2113,#2114,#2123,#2130,#2131)); +#2133=FACE_BOUND('',#2132,.T.); +#2134=ADVANCED_FACE('',(#2133),#2112,.T.); +#2135=CARTESIAN_POINT('',(-34.150818388,-22.010798673,23.774665619)); +#2136=DIRECTION('',(-0.062573166,-0.864328323,-0.49902019)); +#2137=DIRECTION('',(0.,0.5,-0.866025404)); +#2138=AXIS2_PLACEMENT_3D('',#2135,#2136,#2137); +#2139=CYLINDRICAL_SURFACE('',#2138,1.6); +#2140=ORIENTED_EDGE('',*,*,#1396,.F.); +#2141=ORIENTED_EDGE('',*,*,#1216,.F.); +#2142=CARTESIAN_POINT('',(-34.071891653,-20.920577137,24.404105316)); +#2143=DIRECTION('',(-0.062573166,-0.864328323,-0.49902019)); +#2144=DIRECTION('',(0.,0.5,-0.866025404)); +#2145=AXIS2_PLACEMENT_3D('',#2142,#2143,#2144); +#2146=CIRCLE('',#2145,1.6); +#2147=EDGE_CURVE('',#1331,#1205,#2146,.T.); +#2148=ORIENTED_EDGE('',*,*,#2147,.F.); +#2149=ORIENTED_EDGE('',*,*,#1336,.F.); +#2150=EDGE_LOOP('',(#2140,#2141,#2148,#2149)); +#2151=FACE_BOUND('',#2150,.T.); +#2152=ADVANCED_FACE('',(#2151),#2139,.F.); +#2153=CARTESIAN_POINT('',(-34.044242335,-21.37593555,26.057444016)); +#2154=CARTESIAN_POINT('',(-33.86521349,-21.375933037,26.057441562)); +#2155=CARTESIAN_POINT('',(-33.686222908,-21.35423453,26.036249177)); +#2156=CARTESIAN_POINT('',(-33.34814205,-21.269847311,25.953830306)); +#2157=CARTESIAN_POINT('',(-33.189124105,-21.207173991,25.892618854)); +#2158=CARTESIAN_POINT('',(-32.908765398,-21.047815856,25.73697778)); +#2159=CARTESIAN_POINT('',(-32.78748366,-20.95116459,25.642580924)); +#2160=CARTESIAN_POINT('',(-32.596155901,-20.73462859,25.431095669)); +#2161=CARTESIAN_POINT('',(-32.52615016,-20.614789443,25.314051794)); +#2162=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094)); +#2163=CARTESIAN_POINT('',(-34.044242335,-21.477890788,25.953053857)); +#2164=CARTESIAN_POINT('',(-33.86521349,-21.480535584,25.95034087)); +#2165=CARTESIAN_POINT('',(-33.686222908,-21.463416312,25.924459888)); +#2166=CARTESIAN_POINT('',(-33.34814205,-21.391544373,25.829226843)); +#2167=CARTESIAN_POINT('',(-33.189124105,-21.336804659,25.759892314)); +#2168=CARTESIAN_POINT('',(-32.908765398,-21.195786097,25.585473675)); +#2169=CARTESIAN_POINT('',(-32.78748366,-21.109536938,25.480426287)); +#2170=CARTESIAN_POINT('',(-32.596155901,-20.915117027,25.24629676)); +#2171=CARTESIAN_POINT('',(-32.52615016,-20.806987206,25.117263914)); +#2172=CARTESIAN_POINT('',(-32.485681589,-20.693929013,24.983412718)); +#2173=CARTESIAN_POINT('',(-34.053622998,-21.594279197,25.862816127)); +#2174=CARTESIAN_POINT('',(-33.874327949,-21.600334865,25.858154442)); +#2175=CARTESIAN_POINT('',(-33.695071543,-21.588732199,25.82851274)); +#2176=CARTESIAN_POINT('',(-33.356573322,-21.531505648,25.722564093)); +#2177=CARTESIAN_POINT('',(-33.197404537,-21.485892009,25.646276929)); +#2178=CARTESIAN_POINT('',(-32.916951512,-21.365752303,25.455567475)); +#2179=CARTESIAN_POINT('',(-32.795726821,-21.29125184,25.341185649)); +#2180=CARTESIAN_POINT('',(-32.604772893,-21.121694179,25.0870932)); +#2181=CARTESIAN_POINT('',(-32.535084208,-21.026673096,24.947436487)); +#2182=CARTESIAN_POINT('',(-32.495062298,-20.926704646,24.802937935)); +#2183=CARTESIAN_POINT('',(-34.07189178,-21.720613244,25.789806487)); +#2184=CARTESIAN_POINT('',(-33.892066329,-21.730380291,25.784177208)); +#2185=CARTESIAN_POINT('',(-33.712280296,-21.724784039,25.751941994)); +#2186=CARTESIAN_POINT('',(-33.372951287,-21.683491836,25.637874422)); +#2187=CARTESIAN_POINT('',(-33.213482771,-21.647803064,25.556063836)); +#2188=CARTESIAN_POINT('',(-32.932843808,-21.550346997,25.352074817)); +#2189=CARTESIAN_POINT('',(-32.811733971,-21.488600756,25.22994045)); +#2190=CARTESIAN_POINT('',(-32.621525203,-21.346001932,24.959099936)); +#2191=CARTESIAN_POINT('',(-32.552467353,-21.265180153,24.810452295)); +#2192=CARTESIAN_POINT('',(-32.513331173,-21.179371452,24.656918992)); +#2193=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#2153,#2154,#2155,#2156,#2157,#2158,#2159,#2160,#2161,#2162),(#2163,#2164,#2165,#2166,#2167,#2168,#2169,#2170,#2171,#2172),(#2173,#2174,#2175,#2176,#2177,#2178,#2179,#2180,#2181,#2182),(#2183,#2184,#2185,#2186,#2187,#2188,#2189,#2190,#2191,#2192)),.UNSPECIFIED.,.F.,.F.,.U.,(4,4),(4,2,2,2,4),(0.,0.273595742),(0.000014476,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#2194=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094)); +#2195=CARTESIAN_POINT('',(-32.52615016,-20.614789443,25.314051794)); +#2196=CARTESIAN_POINT('',(-32.596155901,-20.73462859,25.431095669)); +#2197=CARTESIAN_POINT('',(-32.78748366,-20.95116459,25.642580924)); +#2198=CARTESIAN_POINT('',(-32.908765398,-21.047815856,25.73697778)); +#2199=CARTESIAN_POINT('',(-33.189124105,-21.207173991,25.892618854)); +#2200=CARTESIAN_POINT('',(-33.34814205,-21.269847311,25.953830306)); +#2201=CARTESIAN_POINT('',(-33.686232696,-21.354236974,26.036251563)); +#2202=CARTESIAN_POINT('',(-33.865234219,-21.37593555,26.057444016)); +#2203=CARTESIAN_POINT('',(-34.044273436,-21.37593555,26.057444016)); +#2204=B_SPLINE_CURVE_WITH_KNOTS('',3,(#2194,#2195,#2196,#2197,#2198,#2199,#2200,#2201,#2202,#2203),.UNSPECIFIED.,.F.,.F.,(4,2,2,2,4),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#2205=EDGE_CURVE('',#1339,#2116,#2204,.T.); +#2206=ORIENTED_EDGE('',*,*,#2205,.F.); +#2207=ORIENTED_EDGE('',*,*,#1345,.F.); +#2208=ORIENTED_EDGE('',*,*,#2147,.T.); +#2209=ORIENTED_EDGE('',*,*,#2129,.T.); +#2210=EDGE_LOOP('',(#2206,#2207,#2208,#2209)); +#2211=FACE_BOUND('',#2210,.T.); +#2212=ADVANCED_FACE('',(#2211),#2193,.F.); +#2213=CARTESIAN_POINT('',(23.5,-19.224694785,30.666750919)); +#2214=DIRECTION('',(1.,0.,0.)); +#2215=DIRECTION('',(0.,0.,-1.)); +#2216=AXIS2_PLACEMENT_3D('',#2213,#2214,#2215); +#2217=TOROIDAL_SURFACE('',#2216,4.5,1.5); +#2218=ORIENTED_EDGE('',*,*,#603,.F.); +#2219=ORIENTED_EDGE('',*,*,#277,.F.); +#2220=CARTESIAN_POINT('',(23.5,-19.224694785,26.166750919)); +#2221=DIRECTION('',(0.,1.,0.)); +#2222=DIRECTION('',(0.,-0.,1.)); +#2223=AXIS2_PLACEMENT_3D('',#2220,#2221,#2222); +#2224=CIRCLE('',#2223,1.5); +#2225=EDGE_CURVE('',#687,#263,#2224,.T.); +#2226=ORIENTED_EDGE('',*,*,#2225,.F.); +#2227=ORIENTED_EDGE('',*,*,#1784,.F.); +#2228=ORIENTED_EDGE('',*,*,#824,.F.); +#2229=EDGE_LOOP('',(#2218,#2219,#2226,#2227,#2228)); +#2230=FACE_BOUND('',#2229,.T.); +#2231=ADVANCED_FACE('',(#2230),#2217,.T.); +#2232=CARTESIAN_POINT('',(23.5,-5.67149291,26.166750919)); +#2233=DIRECTION('',(0.,-1.,0.)); +#2234=DIRECTION('',(0.,0.,-1.)); +#2235=AXIS2_PLACEMENT_3D('',#2232,#2233,#2234); +#2236=CYLINDRICAL_SURFACE('',#2235,1.5); +#2237=ORIENTED_EDGE('',*,*,#2225,.T.); +#2238=ORIENTED_EDGE('',*,*,#268,.F.); +#2239=CARTESIAN_POINT('',(23.5,5.485205765,26.166750919)); +#2240=DIRECTION('',(0.,1.,0.)); +#2241=DIRECTION('',(0.,-0.,1.)); +#2242=AXIS2_PLACEMENT_3D('',#2239,#2240,#2241); +#2243=CIRCLE('',#2242,1.5); +#2244=EDGE_CURVE('',#660,#261,#2243,.T.); +#2245=ORIENTED_EDGE('',*,*,#2244,.F.); +#2246=ORIENTED_EDGE('',*,*,#698,.F.); +#2247=EDGE_LOOP('',(#2237,#2238,#2245,#2246)); +#2248=FACE_BOUND('',#2247,.T.); +#2249=ADVANCED_FACE('',(#2248),#2236,.T.); +#2250=CARTESIAN_POINT('',(23.5,5.485205765,17.666750919)); +#2251=DIRECTION('',(1.,0.,0.)); +#2252=DIRECTION('',(0.,0.,-1.)); +#2253=AXIS2_PLACEMENT_3D('',#2250,#2251,#2252); +#2254=TOROIDAL_SURFACE('',#2253,8.5,1.5); +#2255=ORIENTED_EDGE('',*,*,#2244,.T.); +#2256=ORIENTED_EDGE('',*,*,#350,.F.); +#2257=CARTESIAN_POINT('',(23.5,11.69700724,23.468778362)); +#2258=DIRECTION('',(0.,0.682591464,-0.730800173)); +#2259=DIRECTION('',(0.,0.730800173,0.682591464)); +#2260=AXIS2_PLACEMENT_3D('',#2257,#2258,#2259); +#2261=CIRCLE('',#2260,1.5); +#2262=EDGE_CURVE('',#727,#338,#2261,.T.); +#2263=ORIENTED_EDGE('',*,*,#2262,.F.); +#2264=ORIENTED_EDGE('',*,*,#1452,.F.); +#2265=EDGE_LOOP('',(#2255,#2256,#2263,#2264)); +#2266=FACE_BOUND('',#2265,.T.); +#2267=ADVANCED_FACE('',(#2266),#2254,.T.); +#2268=CARTESIAN_POINT('',(23.5,19.318053285,15.309488264)); +#2269=DIRECTION('',(0.,-0.682591464,0.730800173)); +#2270=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#2271=AXIS2_PLACEMENT_3D('',#2268,#2269,#2270); +#2272=CYLINDRICAL_SURFACE('',#2271,1.5); +#2273=ORIENTED_EDGE('',*,*,#2262,.T.); +#2274=ORIENTED_EDGE('',*,*,#343,.F.); +#2275=CARTESIAN_POINT('',(23.5,22.492048716,11.911326208)); +#2276=DIRECTION('',(0.,0.682591464,-0.730800173)); +#2277=DIRECTION('',(0.,0.730800173,0.682591464)); +#2278=AXIS2_PLACEMENT_3D('',#2275,#2276,#2277); +#2279=CIRCLE('',#2278,1.5); +#2280=EDGE_CURVE('',#709,#329,#2279,.T.); +#2281=ORIENTED_EDGE('',*,*,#2280,.F.); +#2282=ORIENTED_EDGE('',*,*,#738,.F.); +#2283=EDGE_LOOP('',(#2273,#2274,#2281,#2282)); +#2284=FACE_BOUND('',#2283,.T.); +#2285=ADVANCED_FACE('',(#2284),#2272,.T.); +#2286=CARTESIAN_POINT('',(23.5,41.858253313,30.)); +#2287=DIRECTION('',(1.,0.,0.)); +#2288=DIRECTION('',(0.,0.,-1.)); +#2289=AXIS2_PLACEMENT_3D('',#2286,#2287,#2288); +#2290=TOROIDAL_SURFACE('',#2289,26.5,1.5); +#2291=ORIENTED_EDGE('',*,*,#2280,.T.); +#2292=ORIENTED_EDGE('',*,*,#335,.F.); +#2293=CARTESIAN_POINT('',(23.5,41.858253313,3.5)); +#2294=DIRECTION('',(0.,1.,0.)); +#2295=DIRECTION('',(0.,-0.,1.)); +#2296=AXIS2_PLACEMENT_3D('',#2293,#2294,#2295); +#2297=CIRCLE('',#2296,1.5); +#2298=EDGE_CURVE('',#215,#321,#2297,.T.); +#2299=ORIENTED_EDGE('',*,*,#2298,.F.); +#2300=ORIENTED_EDGE('',*,*,#1559,.F.); +#2301=EDGE_LOOP('',(#2291,#2292,#2299,#2300)); +#2302=FACE_BOUND('',#2301,.T.); +#2303=ADVANCED_FACE('',(#2302),#2290,.T.); +#2304=CARTESIAN_POINT('',(23.5,60.5,2.5)); +#2305=DIRECTION('',(0.,0.,-1.)); +#2306=DIRECTION('',(-1.,0.,0.)); +#2307=AXIS2_PLACEMENT_3D('',#2304,#2305,#2306); +#2308=CYLINDRICAL_SURFACE('',#2307,1.5); +#2309=ORIENTED_EDGE('',*,*,#505,.F.); +#2310=ORIENTED_EDGE('',*,*,#543,.F.); +#2311=CARTESIAN_POINT('',(23.5,60.5,3.5)); +#2312=DIRECTION('',(0.,0.,1.)); +#2313=DIRECTION('',(1.,0.,-0.)); +#2314=AXIS2_PLACEMENT_3D('',#2311,#2312,#2313); +#2315=CIRCLE('',#2314,1.5); +#2316=EDGE_CURVE('',#313,#532,#2315,.T.); +#2317=ORIENTED_EDGE('',*,*,#2316,.F.); +#2318=ORIENTED_EDGE('',*,*,#318,.F.); +#2319=EDGE_LOOP('',(#2309,#2310,#2317,#2318)); +#2320=FACE_BOUND('',#2319,.T.); +#2321=ADVANCED_FACE('',(#2320),#2308,.T.); +#2322=CARTESIAN_POINT('',(23.5,62.,3.5)); +#2323=DIRECTION('',(0.,-1.,0.)); +#2324=DIRECTION('',(0.,0.,-1.)); +#2325=AXIS2_PLACEMENT_3D('',#2322,#2323,#2324); +#2326=CYLINDRICAL_SURFACE('',#2325,1.5); +#2327=ORIENTED_EDGE('',*,*,#2298,.T.); +#2328=ORIENTED_EDGE('',*,*,#326,.F.); +#2329=CARTESIAN_POINT('',(23.5,60.5,3.5)); +#2330=DIRECTION('',(0.,1.,0.)); +#2331=DIRECTION('',(0.,-0.,1.)); +#2332=AXIS2_PLACEMENT_3D('',#2329,#2330,#2331); +#2333=CIRCLE('',#2332,1.5); +#2334=EDGE_CURVE('',#223,#313,#2333,.T.); +#2335=ORIENTED_EDGE('',*,*,#2334,.F.); +#2336=ORIENTED_EDGE('',*,*,#228,.F.); +#2337=EDGE_LOOP('',(#2327,#2328,#2335,#2336)); +#2338=FACE_BOUND('',#2337,.T.); +#2339=ADVANCED_FACE('',(#2338),#2326,.T.); +#2340=CARTESIAN_POINT('',(23.5,60.5,3.5)); +#2341=DIRECTION('',(1.,0.,0.)); +#2342=DIRECTION('',(0.,0.,-1.)); +#2343=AXIS2_PLACEMENT_3D('',#2340,#2341,#2342); +#2344=SPHERICAL_SURFACE('',#2343,1.5); +#2345=ORIENTED_EDGE('',*,*,#2334,.T.); +#2346=ORIENTED_EDGE('',*,*,#2316,.T.); +#2347=CARTESIAN_POINT('',(23.5,60.5,3.5)); +#2348=DIRECTION('',(-1.,-0.,-0.)); +#2349=DIRECTION('',(0.,0.,-1.)); +#2350=AXIS2_PLACEMENT_3D('',#2347,#2348,#2349); +#2351=CIRCLE('',#2350,1.5); +#2352=EDGE_CURVE('',#223,#532,#2351,.T.); +#2353=ORIENTED_EDGE('',*,*,#2352,.F.); +#2354=EDGE_LOOP('',(#2345,#2346,#2353)); +#2355=FACE_BOUND('',#2354,.T.); +#2356=ADVANCED_FACE('',(#2355),#2344,.T.); +#2357=CARTESIAN_POINT('',(-23.5,60.5,2.5)); +#2358=DIRECTION('',(0.,0.,1.)); +#2359=DIRECTION('',(1.,0.,-0.)); +#2360=AXIS2_PLACEMENT_3D('',#2357,#2358,#2359); +#2361=CYLINDRICAL_SURFACE('',#2360,1.5); +#2362=ORIENTED_EDGE('',*,*,#490,.F.); +#2363=ORIENTED_EDGE('',*,*,#427,.F.); +#2364=CARTESIAN_POINT('',(-23.5,60.5,3.5)); +#2365=DIRECTION('',(0.,0.,1.)); +#2366=DIRECTION('',(1.,0.,-0.)); +#2367=AXIS2_PLACEMENT_3D('',#2364,#2365,#2366); +#2368=CIRCLE('',#2367,1.5); +#2369=EDGE_CURVE('',#524,#414,#2368,.T.); +#2370=ORIENTED_EDGE('',*,*,#2369,.F.); +#2371=ORIENTED_EDGE('',*,*,#529,.F.); +#2372=EDGE_LOOP('',(#2362,#2363,#2370,#2371)); +#2373=FACE_BOUND('',#2372,.T.); +#2374=ADVANCED_FACE('',(#2373),#2361,.T.); +#2375=CARTESIAN_POINT('',(0.,60.5,3.5)); +#2376=DIRECTION('',(1.,0.,0.)); +#2377=DIRECTION('',(0.,0.,-1.)); +#2378=AXIS2_PLACEMENT_3D('',#2375,#2376,#2377); +#2379=CYLINDRICAL_SURFACE('',#2378,1.5); +#2380=ORIENTED_EDGE('',*,*,#2352,.T.); +#2381=ORIENTED_EDGE('',*,*,#537,.F.); +#2382=CARTESIAN_POINT('',(-23.5,60.5,3.5)); +#2383=DIRECTION('',(-1.,0.,0.)); +#2384=DIRECTION('',(0.,0.,1.)); +#2385=AXIS2_PLACEMENT_3D('',#2382,#2383,#2384); +#2386=CIRCLE('',#2385,1.5); +#2387=EDGE_CURVE('',#231,#524,#2386,.T.); +#2388=ORIENTED_EDGE('',*,*,#2387,.F.); +#2389=ORIENTED_EDGE('',*,*,#236,.F.); +#2390=EDGE_LOOP('',(#2380,#2381,#2388,#2389)); +#2391=FACE_BOUND('',#2390,.T.); +#2392=ADVANCED_FACE('',(#2391),#2379,.T.); +#2393=CARTESIAN_POINT('',(-23.5,60.5,3.5)); +#2394=DIRECTION('',(0.,1.,0.)); +#2395=DIRECTION('',(0.,-0.,1.)); +#2396=AXIS2_PLACEMENT_3D('',#2393,#2394,#2395); +#2397=SPHERICAL_SURFACE('',#2396,1.5); +#2398=ORIENTED_EDGE('',*,*,#2387,.T.); +#2399=ORIENTED_EDGE('',*,*,#2369,.T.); +#2400=CARTESIAN_POINT('',(-23.5,60.5,3.5)); +#2401=DIRECTION('',(-0.,-1.,-0.)); +#2402=DIRECTION('',(0.,-0.,1.)); +#2403=AXIS2_PLACEMENT_3D('',#2400,#2401,#2402); +#2404=CIRCLE('',#2403,1.5); +#2405=EDGE_CURVE('',#231,#414,#2404,.T.); +#2406=ORIENTED_EDGE('',*,*,#2405,.F.); +#2407=EDGE_LOOP('',(#2398,#2399,#2406)); +#2408=FACE_BOUND('',#2407,.T.); +#2409=ADVANCED_FACE('',(#2408),#2397,.T.); +#2410=CARTESIAN_POINT('',(-23.5,62.,3.5)); +#2411=DIRECTION('',(0.,-1.,0.)); +#2412=DIRECTION('',(0.,0.,-1.)); +#2413=AXIS2_PLACEMENT_3D('',#2410,#2411,#2412); +#2414=CYLINDRICAL_SURFACE('',#2413,1.5); +#2415=ORIENTED_EDGE('',*,*,#2405,.T.); +#2416=ORIENTED_EDGE('',*,*,#419,.F.); +#2417=CARTESIAN_POINT('',(-23.5,41.858253313,3.5)); +#2418=DIRECTION('',(0.,-1.,0.)); +#2419=DIRECTION('',(0.,0.,-1.)); +#2420=AXIS2_PLACEMENT_3D('',#2417,#2418,#2419); +#2421=CIRCLE('',#2420,1.5); +#2422=EDGE_CURVE('',#239,#405,#2421,.T.); +#2423=ORIENTED_EDGE('',*,*,#2422,.F.); +#2424=ORIENTED_EDGE('',*,*,#244,.F.); +#2425=EDGE_LOOP('',(#2415,#2416,#2423,#2424)); +#2426=FACE_BOUND('',#2425,.T.); +#2427=ADVANCED_FACE('',(#2426),#2414,.T.); +#2428=CARTESIAN_POINT('',(-23.5,41.858253313,30.)); +#2429=DIRECTION('',(-1.,0.,0.)); +#2430=DIRECTION('',(0.,0.,1.)); +#2431=AXIS2_PLACEMENT_3D('',#2428,#2429,#2430); +#2432=TOROIDAL_SURFACE('',#2431,26.5,1.5); +#2433=ORIENTED_EDGE('',*,*,#2422,.T.); +#2434=ORIENTED_EDGE('',*,*,#411,.F.); +#2435=CARTESIAN_POINT('',(-23.5,22.492048716,11.911326208)); +#2436=DIRECTION('',(-0.,-0.682591464,0.730800173)); +#2437=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#2438=AXIS2_PLACEMENT_3D('',#2435,#2436,#2437); +#2439=CIRCLE('',#2438,1.5); +#2440=EDGE_CURVE('',#1029,#397,#2439,.T.); +#2441=ORIENTED_EDGE('',*,*,#2440,.F.); +#2442=ORIENTED_EDGE('',*,*,#1506,.F.); +#2443=EDGE_LOOP('',(#2433,#2434,#2441,#2442)); +#2444=FACE_BOUND('',#2443,.T.); +#2445=ADVANCED_FACE('',(#2444),#2432,.T.); +#2446=CARTESIAN_POINT('',(-23.5,45.594758942,-12.823036194)); +#2447=DIRECTION('',(0.,-0.682591464,0.730800173)); +#2448=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#2449=AXIS2_PLACEMENT_3D('',#2446,#2447,#2448); +#2450=CYLINDRICAL_SURFACE('',#2449,1.5); +#2451=ORIENTED_EDGE('',*,*,#2440,.T.); +#2452=ORIENTED_EDGE('',*,*,#402,.F.); +#2453=CARTESIAN_POINT('',(-23.5,11.69700724,23.468778362)); +#2454=DIRECTION('',(0.,-0.682591464,0.730800173)); +#2455=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#2456=AXIS2_PLACEMENT_3D('',#2453,#2454,#2455); +#2457=CIRCLE('',#2456,1.5); +#2458=EDGE_CURVE('',#1011,#388,#2457,.T.); +#2459=ORIENTED_EDGE('',*,*,#2458,.F.); +#2460=ORIENTED_EDGE('',*,*,#1040,.F.); +#2461=EDGE_LOOP('',(#2451,#2452,#2459,#2460)); +#2462=FACE_BOUND('',#2461,.T.); +#2463=ADVANCED_FACE('',(#2462),#2450,.T.); +#2464=CARTESIAN_POINT('',(-23.5,5.485205765,17.666750919)); +#2465=DIRECTION('',(-1.,0.,0.)); +#2466=DIRECTION('',(0.,0.,1.)); +#2467=AXIS2_PLACEMENT_3D('',#2464,#2465,#2466); +#2468=TOROIDAL_SURFACE('',#2467,8.5,1.5); +#2469=ORIENTED_EDGE('',*,*,#2458,.T.); +#2470=ORIENTED_EDGE('',*,*,#394,.F.); +#2471=CARTESIAN_POINT('',(-23.5,5.485205765,26.166750919)); +#2472=DIRECTION('',(0.,-1.,0.)); +#2473=DIRECTION('',(0.,0.,-1.)); +#2474=AXIS2_PLACEMENT_3D('',#2471,#2472,#2473); +#2475=CIRCLE('',#2474,1.5); +#2476=EDGE_CURVE('',#981,#380,#2475,.T.); +#2477=ORIENTED_EDGE('',*,*,#2476,.F.); +#2478=ORIENTED_EDGE('',*,*,#1428,.F.); +#2479=EDGE_LOOP('',(#2469,#2470,#2477,#2478)); +#2480=FACE_BOUND('',#2479,.T.); +#2481=ADVANCED_FACE('',(#2480),#2468,.T.); +#2482=CARTESIAN_POINT('',(-23.5,62.,26.166750919)); +#2483=DIRECTION('',(0.,-1.,0.)); +#2484=DIRECTION('',(0.,0.,-1.)); +#2485=AXIS2_PLACEMENT_3D('',#2482,#2483,#2484); +#2486=CYLINDRICAL_SURFACE('',#2485,1.5); +#2487=ORIENTED_EDGE('',*,*,#2476,.T.); +#2488=ORIENTED_EDGE('',*,*,#385,.F.); +#2489=CARTESIAN_POINT('',(-23.5,-19.224694785,26.166750919)); +#2490=DIRECTION('',(0.,-1.,0.)); +#2491=DIRECTION('',(0.,0.,-1.)); +#2492=AXIS2_PLACEMENT_3D('',#2489,#2490,#2491); +#2493=CIRCLE('',#2492,1.5); +#2494=EDGE_CURVE('',#989,#371,#2493,.T.); +#2495=ORIENTED_EDGE('',*,*,#2494,.F.); +#2496=ORIENTED_EDGE('',*,*,#994,.F.); +#2497=EDGE_LOOP('',(#2487,#2488,#2495,#2496)); +#2498=FACE_BOUND('',#2497,.T.); +#2499=ADVANCED_FACE('',(#2498),#2486,.T.); +#2500=CARTESIAN_POINT('',(-23.5,-19.224694785,30.666750919)); +#2501=DIRECTION('',(-1.,0.,0.)); +#2502=DIRECTION('',(0.,0.,1.)); +#2503=AXIS2_PLACEMENT_3D('',#2500,#2501,#2502); +#2504=TOROIDAL_SURFACE('',#2503,4.5,1.5); +#2505=ORIENTED_EDGE('',*,*,#891,.F.); +#2506=ORIENTED_EDGE('',*,*,#1826,.F.); +#2507=ORIENTED_EDGE('',*,*,#2494,.T.); +#2508=ORIENTED_EDGE('',*,*,#377,.F.); +#2509=ORIENTED_EDGE('',*,*,#929,.F.); +#2510=EDGE_LOOP('',(#2505,#2506,#2507,#2508,#2509)); +#2511=FACE_BOUND('',#2510,.T.); +#2512=ADVANCED_FACE('',(#2511),#2504,.T.); +#2513=CARTESIAN_POINT('',(17.,4.480500687,11.)); +#2514=DIRECTION('',(1.,0.,0.)); +#2515=DIRECTION('',(0.,0.,-1.)); +#2516=AXIS2_PLACEMENT_3D('',#2513,#2514,#2515); +#2517=DEGENERATE_TOROIDAL_SURFACE('',#2516,3.,3.,.T.); +#2518=ORIENTED_EDGE('',*,*,#89,.T.); +#2519=ORIENTED_EDGE('',*,*,#1605,.F.); +#2520=CARTESIAN_POINT('',(17.,4.480500687,11.)); +#2521=DIRECTION('',(1.,0.,0.)); +#2522=DIRECTION('',(0.,0.,-1.)); +#2523=AXIS2_PLACEMENT_3D('',#2520,#2521,#2522); +#2524=CIRCLE('',#2523,6.); +#2525=EDGE_CURVE('',#622,#199,#2524,.T.); +#2526=ORIENTED_EDGE('',*,*,#2525,.F.); +#2527=ORIENTED_EDGE('',*,*,#1650,.F.); +#2528=EDGE_LOOP('',(#2518,#2519,#2526,#2527)); +#2529=FACE_BOUND('',#2528,.T.); +#2530=ADVANCED_FACE('',(#2529),#2517,.F.); +#2531=CARTESIAN_POINT('',(-0.,4.480500687,11.)); +#2532=DIRECTION('',(1.,-0.,0.)); +#2533=DIRECTION('',(0.,1.,0.)); +#2534=AXIS2_PLACEMENT_3D('',#2531,#2532,#2533); +#2535=CYLINDRICAL_SURFACE('',#2534,6.); +#2536=ORIENTED_EDGE('',*,*,#2525,.T.); +#2537=ORIENTED_EDGE('',*,*,#204,.F.); +#2538=CARTESIAN_POINT('',(-17.,4.480500687,11.)); +#2539=DIRECTION('',(1.,-0.,-0.)); +#2540=DIRECTION('',(0.,0.,1.)); +#2541=AXIS2_PLACEMENT_3D('',#2538,#2539,#2540); +#2542=CIRCLE('',#2541,6.); +#2543=EDGE_CURVE('',#630,#191,#2542,.T.); +#2544=ORIENTED_EDGE('',*,*,#2543,.F.); +#2545=ORIENTED_EDGE('',*,*,#635,.F.); +#2546=EDGE_LOOP('',(#2536,#2537,#2544,#2545)); +#2547=FACE_BOUND('',#2546,.T.); +#2548=ADVANCED_FACE('',(#2547),#2535,.F.); +#2549=CARTESIAN_POINT('',(-17.,4.480500687,11.)); +#2550=DIRECTION('',(-1.,0.,0.)); +#2551=DIRECTION('',(0.,0.,1.)); +#2552=AXIS2_PLACEMENT_3D('',#2549,#2550,#2551); +#2553=DEGENERATE_TOROIDAL_SURFACE('',#2552,3.,3.,.T.); +#2554=ORIENTED_EDGE('',*,*,#1696,.F.); +#2555=ORIENTED_EDGE('',*,*,#156,.T.); +#2556=ORIENTED_EDGE('',*,*,#1741,.F.); +#2557=ORIENTED_EDGE('',*,*,#2543,.T.); +#2558=EDGE_LOOP('',(#2554,#2555,#2556,#2557)); +#2559=FACE_BOUND('',#2558,.T.); +#2560=ADVANCED_FACE('',(#2559),#2553,.F.); +#2561=CARTESIAN_POINT('',(-20.233154644,-19.224694785,27.666750919)); +#2562=CARTESIAN_POINT('',(-20.148786426,-19.181754028,27.666750919)); +#2563=CARTESIAN_POINT('',(-20.06442732,-19.13881791,27.653218434)); +#2564=CARTESIAN_POINT('',(-19.902450167,-19.056376659,27.600166937)); +#2565=CARTESIAN_POINT('',(-19.824849615,-19.01688043,27.560653656)); +#2566=CARTESIAN_POINT('',(-19.682608783,-18.944484343,27.45880096)); +#2567=CARTESIAN_POINT('',(-19.617983866,-18.911592303,27.396472548)); +#2568=CARTESIAN_POINT('',(-19.506875188,-18.855041498,27.253978732)); +#2569=CARTESIAN_POINT('',(-19.460403428,-18.83138884,27.17382872)); +#2570=CARTESIAN_POINT('',(-19.424865983,-18.813301404,27.087969303)); +#2571=CARTESIAN_POINT('',(-20.136066749,-19.367760489,27.666750919)); +#2572=CARTESIAN_POINT('',(-20.055913049,-19.325341908,27.664703136)); +#2573=CARTESIAN_POINT('',(-19.975766472,-19.283572473,27.650272131)); +#2574=CARTESIAN_POINT('',(-19.821314357,-19.204375435,27.597703841)); +#2575=CARTESIAN_POINT('',(-19.747022556,-19.166954887,27.55957127)); +#2576=CARTESIAN_POINT('',(-19.609712563,-19.09918955,27.462385719)); +#2577=CARTESIAN_POINT('',(-19.546706617,-19.068850762,27.403341384)); +#2578=CARTESIAN_POINT('',(-19.436584705,-19.017460263,27.268641018)); +#2579=CARTESIAN_POINT('',(-19.389478613,-18.996413074,27.192996945)); +#2580=CARTESIAN_POINT('',(-19.352050062,-18.98077405,27.111806948)); +#2581=CARTESIAN_POINT('',(-20.035680002,-19.507579233,27.676886562)); +#2582=CARTESIAN_POINT('',(-19.959518462,-19.466452863,27.672921518)); +#2583=CARTESIAN_POINT('',(-19.883362577,-19.426441036,27.657707868)); +#2584=CARTESIAN_POINT('',(-19.736121022,-19.351303274,27.605801519)); +#2585=CARTESIAN_POINT('',(-19.665046288,-19.316182906,27.569112694)); +#2586=CARTESIAN_POINT('',(-19.532712716,-19.253167859,27.47670241)); +#2587=CARTESIAN_POINT('',(-19.471463721,-19.225277838,27.420987808)); +#2588=CARTESIAN_POINT('',(-19.36287698,-19.178579319,27.294237237)); +#2589=CARTESIAN_POINT('',(-19.315547337,-19.159774261,27.223210658)); +#2590=CARTESIAN_POINT('',(-19.276760001,-19.146134608,27.146888636)); +#2591=CARTESIAN_POINT('',(-19.832562253,-19.782774395,27.715842646)); +#2592=CARTESIAN_POINT('',(-19.763909549,-19.745311545,27.708682754)); +#2593=CARTESIAN_POINT('',(-19.695260252,-19.709620398,27.692417751)); +#2594=CARTESIAN_POINT('',(-19.561713806,-19.643727496,27.642573276)); +#2595=CARTESIAN_POINT('',(-19.49682329,-19.613528998,27.608996297)); +#2596=CARTESIAN_POINT('',(-19.374350632,-19.560270669,27.526366394)); +#2597=CARTESIAN_POINT('',(-19.31677459,-19.537213456,27.477317563)); +#2598=CARTESIAN_POINT('',(-19.212092048,-19.499494037,27.366424274)); +#2599=CARTESIAN_POINT('',(-19.164990789,-19.484833672,27.304585295)); +#2600=CARTESIAN_POINT('',(-19.124421689,-19.474768808,27.238037281)); +#2601=CARTESIAN_POINT('',(-19.729763615,-19.91812436,27.744655131)); +#2602=CARTESIAN_POINT('',(-19.664630304,-19.883033769,27.736213163)); +#2603=CARTESIAN_POINT('',(-19.59949962,-19.849906622,27.719675718)); +#2604=CARTESIAN_POINT('',(-19.472442605,-19.789200439,27.671225951)); +#2605=CARTESIAN_POINT('',(-19.410521399,-19.761623833,27.639315588)); +#2606=CARTESIAN_POINT('',(-19.292936542,-19.713371201,27.561690155)); +#2607=CARTESIAN_POINT('',(-19.23727764,-19.6926971,27.515978204)); +#2608=CARTESIAN_POINT('',(-19.134965101,-19.659261829,27.41299586)); +#2609=CARTESIAN_POINT('',(-19.088315608,-19.646501986,27.355729598)); +#2610=CARTESIAN_POINT('',(-19.047322711,-19.638010157,27.294090579)); +#2611=CARTESIAN_POINT('',(-19.577879254,-20.119399603,27.802422834)); +#2612=CARTESIAN_POINT('',(-19.517645568,-20.088420938,27.79271703)); +#2613=CARTESIAN_POINT('',(-19.457413645,-20.059552403,27.776292347)); +#2614=CARTESIAN_POINT('',(-19.339468849,-20.007239656,27.730692211)); +#2615=CARTESIAN_POINT('',(-19.281759429,-19.983796971,27.701518092)); +#2616=CARTESIAN_POINT('',(-19.171277123,-19.943316169,27.631639876)); +#2617=CARTESIAN_POINT('',(-19.118507473,-19.926279233,27.590937822)); +#2618=CARTESIAN_POINT('',(-19.020116225,-19.899321932,27.499706278)); +#2619=CARTESIAN_POINT('',(-18.974497511,-19.889402351,27.449179452)); +#2620=CARTESIAN_POINT('',(-18.93340944,-19.883248129,27.394795572)); +#2621=CARTESIAN_POINT('',(-19.52766057,-20.186206081,27.824122401)); +#2622=CARTESIAN_POINT('',(-19.468996264,-20.156690931,27.81410517)); +#2623=CARTESIAN_POINT('',(-19.410333426,-20.129311321,27.797805107)); +#2624=CARTESIAN_POINT('',(-19.295321022,-20.079899565,27.753281707)); +#2625=CARTESIAN_POINT('',(-19.238974448,-20.0578687,27.725059528)); +#2626=CARTESIAN_POINT('',(-19.130819959,-20.020022647,27.657805069)); +#2627=CARTESIAN_POINT('',(-19.079014859,-20.004208441,27.618774536)); +#2628=CARTESIAN_POINT('',(-18.981990038,-19.979418583,27.531442484)); +#2629=CARTESIAN_POINT('',(-18.936772846,-19.970443573,27.483143232)); +#2630=CARTESIAN_POINT('',(-18.895742078,-19.965064385,27.43116075)); +#2631=CARTESIAN_POINT('',(-19.429040963,-20.319590869,27.872785724)); +#2632=CARTESIAN_POINT('',(-19.37337729,-20.293155445,27.862391803)); +#2633=CARTESIAN_POINT('',(-19.317714698,-20.26887065,27.84653623)); +#2634=CARTESIAN_POINT('',(-19.208332177,-20.225446915,27.804454999)); +#2635=CARTESIAN_POINT('',(-19.154614473,-20.206308854,27.778230195)); +#2636=CARTESIAN_POINT('',(-19.050999178,-20.173845428,27.7163258)); +#2637=CARTESIAN_POINT('',(-19.001103697,-20.160520719,27.680647465)); +#2638=CARTESIAN_POINT('',(-18.906877398,-20.140147832,27.601080717)); +#2639=CARTESIAN_POINT('',(-18.8625485,-20.133100064,27.557193918)); +#2640=CARTESIAN_POINT('',(-18.821777395,-20.129312947,27.509967526)); +#2641=CARTESIAN_POINT('',(-19.380728302,-20.386057282,27.899727202)); +#2642=CARTESIAN_POINT('',(-19.326492967,-20.361235986,27.889269331)); +#2643=CARTESIAN_POINT('',(-19.272258607,-20.338554868,27.873734053)); +#2644=CARTESIAN_POINT('',(-19.165568136,-20.298213752,27.833017411)); +#2645=CARTESIAN_POINT('',(-19.113113943,-20.280554474,27.807836779)); +#2646=CARTESIAN_POINT('',(-19.011705837,-20.250834791,27.748654703)); +#2647=CARTESIAN_POINT('',(-18.962753746,-20.238774914,27.714654319)); +#2648=CARTESIAN_POINT('',(-18.869957364,-20.220648155,27.638946829)); +#2649=CARTESIAN_POINT('',(-18.826114743,-20.214581595,27.597241079)); +#2650=CARTESIAN_POINT('',(-18.785546227,-20.211610361,27.552365222)); +#2651=CARTESIAN_POINT('',(-19.242517888,-20.583145768,27.988067784)); +#2652=CARTESIAN_POINT('',(-19.192277329,-20.563279756,27.977827821)); +#2653=CARTESIAN_POINT('',(-19.142037357,-20.545488857,27.963566553)); +#2654=CARTESIAN_POINT('',(-19.042901829,-20.514523902,27.927382338)); +#2655=CARTESIAN_POINT('',(-18.994007434,-20.501350191,27.905459811)); +#2656=CARTESIAN_POINT('',(-18.898873496,-20.479963568,27.854536102)); +#2657=CARTESIAN_POINT('',(-18.852635071,-20.471750888,27.825535505)); +#2658=CARTESIAN_POINT('',(-18.764054064,-20.460498057,27.761225188)); +#2659=CARTESIAN_POINT('',(-18.721712527,-20.457458021,27.725916202)); +#2660=CARTESIAN_POINT('',(-18.681888416,-20.45704138,27.687920738)); +#2661=CARTESIAN_POINT('',(-19.158354579,-20.712219807,28.057058529)); +#2662=CARTESIAN_POINT('',(-19.11041912,-20.69582655,28.047501216)); +#2663=CARTESIAN_POINT('',(-19.062484064,-20.681419196,28.034503088)); +#2664=CARTESIAN_POINT('',(-18.967745483,-20.656908957,28.001928628)); +#2665=CARTESIAN_POINT('',(-18.920942833,-20.646806288,27.982352592)); +#2666=CARTESIAN_POINT('',(-18.829575103,-20.631137186,27.937080036)); +#2667=CARTESIAN_POINT('',(-18.785010867,-20.625570889,27.911383927)); +#2668=CARTESIAN_POINT('',(-18.69917368,-20.619099532,27.854472277)); +#2669=CARTESIAN_POINT('',(-18.657901523,-20.618194524,27.823257253)); +#2670=CARTESIAN_POINT('',(-18.61876338,-20.619627853,27.789647736)); +#2671=CARTESIAN_POINT('',(-19.057282168,-20.904812471,28.180185136)); +#2672=CARTESIAN_POINT('',(-19.012049662,-20.893673958,28.172603611)); +#2673=CARTESIAN_POINT('',(-18.966817421,-20.884410713,28.162256329)); +#2674=CARTESIAN_POINT('',(-18.877254703,-20.869817419,28.136235576)); +#2675=CARTESIAN_POINT('',(-18.832924817,-20.864487465,28.120562274)); +#2676=CARTESIAN_POINT('',(-18.746051318,-20.857865289,28.084200874)); +#2677=CARTESIAN_POINT('',(-18.703508279,-20.85657311,28.063513014)); +#2678=CARTESIAN_POINT('',(-18.621057489,-20.858050572,28.017533604)); +#2679=CARTESIAN_POINT('',(-18.581150283,-20.860820202,27.992242357)); +#2680=CARTESIAN_POINT('',(-18.542959044,-20.865592342,27.96490061)); +#2681=CARTESIAN_POINT('',(-19.028137202,-20.968488425,28.224367419)); +#2682=CARTESIAN_POINT('',(-18.983670779,-20.959099476,28.217602424)); +#2683=CARTESIAN_POINT('',(-18.93920462,-20.951553374,28.208262429)); +#2684=CARTESIAN_POINT('',(-18.851113196,-20.940288219,28.184608158)); +#2685=CARTESIAN_POINT('',(-18.807488456,-20.936569232,28.170294023)); +#2686=CARTESIAN_POINT('',(-18.721905407,-20.933027478,28.136961305)); +#2687=CARTESIAN_POINT('',(-18.679947609,-20.933204731,28.11794292)); +#2688=CARTESIAN_POINT('',(-18.598492505,-20.937450944,28.075560411)); +#2689=CARTESIAN_POINT('',(-18.558995685,-20.941519878,28.052196537)); +#2690=CARTESIAN_POINT('',(-18.521102901,-20.947495617,28.026880206)); +#2691=CARTESIAN_POINT('',(-18.982559961,-21.092743469,28.318039031)); +#2692=CARTESIAN_POINT('',(-18.939282686,-21.086741011,28.313200972)); +#2693=CARTESIAN_POINT('',(-18.896005628,-21.082544957,28.306097371)); +#2694=CARTESIAN_POINT('',(-18.810200547,-21.077836947,28.287481142)); +#2695=CARTESIAN_POINT('',(-18.767672953,-21.077325012,28.275968607)); +#2696=CARTESIAN_POINT('',(-18.684103329,-21.079992863,28.248732845)); +#2697=CARTESIAN_POINT('',(-18.643061715,-21.083172633,28.233009752)); +#2698=CARTESIAN_POINT('',(-18.563174905,-21.093167623,28.197623975)); +#2699=CARTESIAN_POINT('',(-18.524330108,-21.099982791,28.177961466)); +#2700=CARTESIAN_POINT('',(-18.48691997,-21.108556102,28.156498764)); +#2701=CARTESIAN_POINT('',(-18.965959287,-21.153638702,28.367724895)); +#2702=CARTESIAN_POINT('',(-18.923109824,-21.149282184,28.363999929)); +#2703=CARTESIAN_POINT('',(-18.880260562,-21.146727813,28.358129295)); +#2704=CARTESIAN_POINT('',(-18.795279712,-21.145265624,28.342194545)); +#2705=CARTESIAN_POINT('',(-18.753148522,-21.146357813,28.332130503)); +#2706=CARTESIAN_POINT('',(-18.670309871,-21.152169966,28.307977097)); +#2707=CARTESIAN_POINT('',(-18.629602797,-21.156889902,28.293887845)); +#2708=CARTESIAN_POINT('',(-18.55029458,-21.169877974,28.2619196)); +#2709=CARTESIAN_POINT('',(-18.511693809,-21.178146047,28.244040757)); +#2710=CARTESIAN_POINT('',(-18.474469465,-21.188118704,28.224416577)); +#2711=CARTESIAN_POINT('',(-18.947422244,-21.272924215,28.473328594)); +#2712=CARTESIAN_POINT('',(-18.905049964,-21.271712362,28.472123871)); +#2713=CARTESIAN_POINT('',(-18.862677868,-21.272341518,28.468949711)); +#2714=CARTESIAN_POINT('',(-18.778616536,-21.277271208,28.458713225)); +#2715=CARTESIAN_POINT('',(-18.736927666,-21.28157172,28.451650943)); +#2716=CARTESIAN_POINT('',(-18.654905008,-21.293774295,28.43375159)); +#2717=CARTESIAN_POINT('',(-18.614571576,-21.301676304,28.422914596)); +#2718=CARTESIAN_POINT('',(-18.535910176,-21.320953969,28.397640034)); +#2719=CARTESIAN_POINT('',(-18.49758255,-21.332329542,28.383202574)); +#2720=CARTESIAN_POINT('',(-18.460566683,-21.345349984,28.36708095)); +#2721=CARTESIAN_POINT('',(-18.94567896,-21.331579113,28.52960732)); +#2722=CARTESIAN_POINT('',(-18.903351254,-21.331871287,28.529820224)); +#2723=CARTESIAN_POINT('',(-18.861023731,-21.33404857,28.528119665)); +#2724=CARTESIAN_POINT('',(-18.777048391,-21.34213869,28.520919222)); +#2725=CARTESIAN_POINT('',(-18.735400935,-21.348051494,28.515419369)); +#2726=CARTESIAN_POINT('',(-18.653454879,-21.363518,28.50070899)); +#2727=CARTESIAN_POINT('',(-18.613156633,-21.373071635,28.491498527)); +#2728=CARTESIAN_POINT('',(-18.53455648,-21.395666665,28.469515202)); +#2729=CARTESIAN_POINT('',(-18.496254911,-21.408707962,28.456742434)); +#2730=CARTESIAN_POINT('',(-18.459259219,-21.423388556,28.442291222)); +#2731=CARTESIAN_POINT('',(-18.957538664,-21.442015114,28.644416897)); +#2732=CARTESIAN_POINT('',(-18.914906086,-21.445011573,28.647622866)); +#2733=CARTESIAN_POINT('',(-18.872273701,-21.450042027,28.648972461)); +#2734=CARTESIAN_POINT('',(-18.787710744,-21.464088445,28.647937006)); +#2735=CARTESIAN_POINT('',(-18.745780555,-21.473104345,28.645551961)); +#2736=CARTESIAN_POINT('',(-18.66331263,-21.494973497,28.637086793)); +#2737=CARTESIAN_POINT('',(-18.622775268,-21.50782665,28.631006709)); +#2738=CARTESIAN_POINT('',(-18.543760707,-21.537158961,28.615251894)); +#2739=CARTESIAN_POINT('',(-18.505283866,-21.553637988,28.605577236)); +#2740=CARTESIAN_POINT('',(-18.468153997,-21.571794487,28.594185074)); +#2741=CARTESIAN_POINT('',(-18.970958349,-21.494343998,28.703382961)); +#2742=CARTESIAN_POINT('',(-18.927980916,-21.498555772,28.708173936)); +#2743=CARTESIAN_POINT('',(-18.885003689,-21.504906183,28.711110808)); +#2744=CARTESIAN_POINT('',(-18.799776014,-21.521777735,28.713227821)); +#2745=CARTESIAN_POINT('',(-18.757525973,-21.532298797,28.712407953)); +#2746=CARTESIAN_POINT('',(-18.674467585,-21.557334601,28.707026425)); +#2747=CARTESIAN_POINT('',(-18.633659635,-21.571849225,28.702464792)); +#2748=CARTESIAN_POINT('',(-18.55417599,-21.604627647,28.689677954)); +#2749=CARTESIAN_POINT('',(-18.515500675,-21.622891291,28.681452811)); +#2750=CARTESIAN_POINT('',(-18.478218761,-21.642875595,28.671465962)); +#2751=CARTESIAN_POINT('',(-19.010906674,-21.593596665,28.824354335)); +#2752=CARTESIAN_POINT('',(-18.966891148,-21.599950221,28.832440622)); +#2753=CARTESIAN_POINT('',(-18.922875867,-21.608720575,28.83864333)); +#2754=CARTESIAN_POINT('',(-18.835650944,-21.630935218,28.847169209)); +#2755=CARTESIAN_POINT('',(-18.79244179,-21.644379383,28.849492335)); +#2756=CARTESIAN_POINT('',(-18.707620517,-21.675696381,28.850217534)); +#2757=CARTESIAN_POINT('',(-18.666008873,-21.69356904,28.848619606)); +#2758=CARTESIAN_POINT('',(-18.585144808,-21.733416764,28.841532966)); +#2759=CARTESIAN_POINT('',(-18.545892841,-21.755391608,28.836044296)); +#2760=CARTESIAN_POINT('',(-18.508180005,-21.779217002,28.828660974)); +#2761=CARTESIAN_POINT('',(-19.037657276,-21.640813009,28.886798537)); +#2762=CARTESIAN_POINT('',(-18.992942422,-21.648097847,28.896607262)); +#2763=CARTESIAN_POINT('',(-18.948227845,-21.657974555,28.90450034)); +#2764=CARTESIAN_POINT('',(-18.85965878,-21.682722764,28.916305247)); +#2765=CARTESIAN_POINT('',(-18.81580484,-21.697594113,28.920217004)); +#2766=CARTESIAN_POINT('',(-18.7298012,-21.732046674,28.923985644)); +#2767=CARTESIAN_POINT('',(-18.687652031,-21.751627675,28.923842506)); +#2768=CARTESIAN_POINT('',(-18.605869402,-21.79512425,28.919505678)); +#2769=CARTESIAN_POINT('',(-18.566236446,-21.819039556,28.915312017)); +#2770=CARTESIAN_POINT('',(-18.528242957,-21.844892901,28.909134156)); +#2771=CARTESIAN_POINT('',(-19.100687063,-21.728431129,29.012313833)); +#2772=CARTESIAN_POINT('',(-19.054297374,-21.737250886,29.025575369)); +#2773=CARTESIAN_POINT('',(-19.007908044,-21.74907936,29.036842725)); +#2774=CARTESIAN_POINT('',(-18.916128498,-21.778500047,29.055148285)); +#2775=CARTESIAN_POINT('',(-18.870738993,-21.796092033,29.06218635)); +#2776=CARTESIAN_POINT('',(-18.781937457,-21.836661873,29.071883224)); +#2777=CARTESIAN_POINT('',(-18.738526112,-21.859639414,29.074541961)); +#2778=CARTESIAN_POINT('',(-18.654616751,-21.910486689,29.075424368)); +#2779=CARTESIAN_POINT('',(-18.614119384,-21.938356032,29.073648033)); +#2780=CARTESIAN_POINT('',(-18.575515297,-21.968372023,29.069673988)); +#2781=CARTESIAN_POINT('',(-19.136812789,-21.768861653,29.07532019)); +#2782=CARTESIAN_POINT('',(-19.089451597,-21.778287649,29.090310109)); +#2783=CARTESIAN_POINT('',(-19.042090818,-21.790963273,29.103259671)); +#2784=CARTESIAN_POINT('',(-18.948452632,-21.822524724,29.124784182)); +#2785=CARTESIAN_POINT('',(-18.902176043,-21.841410277,29.133358947)); +#2786=CARTESIAN_POINT('',(-18.811765751,-21.884960597,29.145939516)); +#2787=CARTESIAN_POINT('',(-18.767632838,-21.909624987,29.149945213)); +#2788=CARTESIAN_POINT('',(-18.682520586,-21.964170175,29.153297733)); +#2789=CARTESIAN_POINT('',(-18.64154199,-21.994050501,29.15264453)); +#2790=CARTESIAN_POINT('',(-18.602609591,-22.02619811,29.149670155)); +#2791=CARTESIAN_POINT('',(-19.181984147,-21.811930157,29.148090223)); +#2792=CARTESIAN_POINT('',(-19.133383251,-21.821882611,29.165043732)); +#2793=CARTESIAN_POINT('',(-19.08478285,-21.835397618,29.179905697)); +#2794=CARTESIAN_POINT('',(-18.98878073,-21.869219694,29.205080326)); +#2795=CARTESIAN_POINT('',(-18.941379989,-21.889526417,29.215392735)); +#2796=CARTESIAN_POINT('',(-18.848947276,-21.93643083,29.231213647)); +#2797=CARTESIAN_POINT('',(-18.803916246,-21.963028042,29.236721989)); +#2798=CARTESIAN_POINT('',(-18.717334574,-22.021857058,29.24279874)); +#2799=CARTESIAN_POINT('',(-18.675784815,-22.054088264,29.243367086)); +#2800=CARTESIAN_POINT('',(-18.636488109,-22.088739041,29.241458417)); +#2801=CARTESIAN_POINT('',(-19.187835904,-21.817382328,29.157415737)); +#2802=CARTESIAN_POINT('',(-19.139073977,-21.827399014,29.174620283)); +#2803=CARTESIAN_POINT('',(-19.090312556,-21.841019003,29.189726765)); +#2804=CARTESIAN_POINT('',(-18.994003507,-21.875126843,29.215367918)); +#2805=CARTESIAN_POINT('',(-18.946456877,-21.89561434,29.225902322)); +#2806=CARTESIAN_POINT('',(-18.853761979,-21.942946952,29.24213682)); +#2807=CARTESIAN_POINT('',(-18.808614672,-21.969791576,29.247836745)); +#2808=CARTESIAN_POINT('',(-18.721843244,-22.029169824,29.254260219)); +#2809=CARTESIAN_POINT('',(-18.680220023,-22.061702832,29.254983702)); +#2810=CARTESIAN_POINT('',(-18.640876927,-22.096675169,29.253209951)); +#2811=CARTESIAN_POINT('',(-19.193754025,-21.822773919,29.166751537)); +#2812=CARTESIAN_POINT('',(-19.144828777,-21.832851702,29.184206724)); +#2813=CARTESIAN_POINT('',(-19.095904047,-21.846574225,29.199557385)); +#2814=CARTESIAN_POINT('',(-18.999283844,-21.880964246,29.225664275)); +#2815=CARTESIAN_POINT('',(-18.951589393,-21.901631381,29.236420228)); +#2816=CARTESIAN_POINT('',(-18.858629133,-21.949391055,29.253067122)); +#2817=CARTESIAN_POINT('',(-18.813364307,-21.97648309,29.258957887)); +#2818=CARTESIAN_POINT('',(-18.726401616,-22.036411425,29.265726168)); +#2819=CARTESIAN_POINT('',(-18.68470467,-22.069247092,29.266603613)); +#2820=CARTESIAN_POINT('',(-18.645315518,-22.104542097,29.264963349)); +#2821=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#2561,#2562,#2563,#2564,#2565,#2566,#2567,#2568,#2569,#2570),(#2571,#2572,#2573,#2574,#2575,#2576,#2577,#2578,#2579,#2580),(#2581,#2582,#2583,#2584,#2585,#2586,#2587,#2588,#2589,#2590),(#2591,#2592,#2593,#2594,#2595,#2596,#2597,#2598,#2599,#2600),(#2601,#2602,#2603,#2604,#2605,#2606,#2607,#2608,#2609,#2610),(#2611,#2612,#2613,#2614,#2615,#2616,#2617,#2618,#2619,#2620),(#2621,#2622,#2623,#2624,#2625,#2626,#2627,#2628,#2629,#2630),(#2631,#2632,#2633,#2634,#2635,#2636,#2637,#2638,#2639,#2640),(#2641,#2642,#2643,#2644,#2645,#2646,#2647,#2648,#2649,#2650),(#2651,#2652,#2653,#2654,#2655,#2656,#2657,#2658,#2659,#2660),(#2661,#2662,#2663,#2664,#2665,#2666,#2667,#2668,#2669,#2670),(#2671,#2672,#2673,#2674,#2675,#2676,#2677,#2678,#2679,#2680),(#2681,#2682,#2683,#2684,#2685,#2686,#2687,#2688,#2689,#2690),(#2691,#2692,#2693,#2694,#2695,#2696,#2697,#2698,#2699,#2700),(#2701,#2702,#2703,#2704,#2705,#2706,#2707,#2708,#2709,#2710),(#2711,#2712,#2713,#2714,#2715,#2716,#2717,#2718,#2719,#2720),(#2721,#2722,#2723,#2724,#2725,#2726,#2727,#2728,#2729,#2730),(#2731,#2732,#2733,#2734,#2735,#2736,#2737,#2738,#2739,#2740),(#2741,#2742,#2743,#2744,#2745,#2746,#2747,#2748,#2749,#2750),(#2751,#2752,#2753,#2754,#2755,#2756,#2757,#2758,#2759,#2760),(#2761,#2762,#2763,#2764,#2765,#2766,#2767,#2768,#2769,#2770),(#2771,#2772,#2773,#2774,#2775,#2776,#2777,#2778,#2779,#2780),(#2781,#2782,#2783,#2784,#2785,#2786,#2787,#2788,#2789,#2790),(#2791,#2792,#2793,#2794,#2795,#2796,#2797,#2798,#2799,#2800),(#2801,#2802,#2803,#2804,#2805,#2806,#2807,#2808,#2809,#2810),(#2811,#2812,#2813,#2814,#2815,#2816,#2817,#2818,#2819,#2820)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(-0.,0.000633434,0.001266868,0.001583585,0.001900302,0.002533736,0.002850452,0.003167169,0.003483886,0.003800603,0.00411732,0.004434037,0.004480535),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#2822=ORIENTED_EDGE('',*,*,#873,.F.); +#2823=ORIENTED_EDGE('',*,*,#1732,.F.); +#2824=CARTESIAN_POINT('',(-20.233154644,-19.224694785,26.666750919)); +#2825=DIRECTION('',(-0.453596325,0.891207257,0.)); +#2826=DIRECTION('',(-0.891207257,-0.453596325,0.)); +#2827=AXIS2_PLACEMENT_3D('',#2824,#2825,#2826); +#2828=CIRCLE('',#2827,1.); +#2829=EDGE_CURVE('',#962,#1707,#2828,.T.); +#2830=ORIENTED_EDGE('',*,*,#2829,.F.); +#2831=ORIENTED_EDGE('',*,*,#1818,.F.); +#2832=EDGE_LOOP('',(#2822,#2823,#2830,#2831)); +#2833=FACE_BOUND('',#2832,.T.); +#2834=ADVANCED_FACE('',(#2833),#2821,.T.); +#2835=CARTESIAN_POINT('',(-19.424860946,-18.81329884,27.087968938)); +#2836=CARTESIAN_POINT('',(-19.442629397,-18.822342478,27.130898684)); +#2837=CARTESIAN_POINT('',(-19.463118754,-18.832770948,27.172410172)); +#2838=CARTESIAN_POINT('',(-19.509127351,-18.856187915,27.251762098)); +#2839=CARTESIAN_POINT('',(-19.53464628,-18.869176254,27.289602)); +#2840=CARTESIAN_POINT('',(-19.590200361,-18.897451539,27.360848964)); +#2841=CARTESIAN_POINT('',(-19.620235137,-18.912738293,27.394255544)); +#2842=CARTESIAN_POINT('',(-19.684216342,-18.945302711,27.455963312)); +#2843=CARTESIAN_POINT('',(-19.718162339,-18.962580155,27.484264083)); +#2844=CARTESIAN_POINT('',(-19.789282672,-18.998778174,27.535190453)); +#2845=CARTESIAN_POINT('',(-19.826456527,-19.017698504,27.557815709)); +#2846=CARTESIAN_POINT('',(-19.903284283,-19.05680144,27.596935518)); +#2847=CARTESIAN_POINT('',(-19.942937662,-19.07698378,27.613429805)); +#2848=CARTESIAN_POINT('',(-20.023926245,-19.118204464,27.639955558)); +#2849=CARTESIAN_POINT('',(-20.0652609,-19.13924253,27.649986843)); +#2850=CARTESIAN_POINT('',(-20.148779962,-19.181751162,27.663384569)); +#2851=CARTESIAN_POINT('',(-20.190963802,-19.20322144,27.666750919)); +#2852=CARTESIAN_POINT('',(-20.233147928,-19.224691864,27.666750919)); +#2853=CARTESIAN_POINT('',(-19.448713801,-18.75844563,27.080161267)); +#2854=CARTESIAN_POINT('',(-19.466391398,-18.767186408,27.123587963)); +#2855=CARTESIAN_POINT('',(-19.486857948,-18.777307374,27.165601144)); +#2856=CARTESIAN_POINT('',(-19.532951271,-18.800103049,27.245943254)); +#2857=CARTESIAN_POINT('',(-19.558577722,-18.8127776,27.284271623)); +#2858=CARTESIAN_POINT('',(-19.614467262,-18.840421384,27.356460958)); +#2859=CARTESIAN_POINT('',(-19.644729962,-18.855390424,27.390321421)); +#2860=CARTESIAN_POINT('',(-19.709273701,-18.887317228,27.452883076)); +#2861=CARTESIAN_POINT('',(-19.743554292,-18.904274769,27.481583832)); +#2862=CARTESIAN_POINT('',(-19.815433436,-18.939831976,27.533239621)); +#2863=CARTESIAN_POINT('',(-19.853031488,-18.958431393,27.556194293)); +#2864=CARTESIAN_POINT('',(-19.930777405,-18.996892194,27.595888852)); +#2865=CARTESIAN_POINT('',(-19.970924727,-19.016753309,27.612628462)); +#2866=CARTESIAN_POINT('',(-20.052948947,-19.057331556,27.63955081)); +#2867=CARTESIAN_POINT('',(-20.094825273,-19.078048406,27.649733361)); +#2868=CARTESIAN_POINT('',(-20.179451939,-19.119914682,27.663333463)); +#2869=CARTESIAN_POINT('',(-20.222201688,-19.141063817,27.666750919)); +#2870=CARTESIAN_POINT('',(-20.264951735,-19.162213099,27.666750919)); +#2871=CARTESIAN_POINT('',(-19.471903453,-18.702783004,27.072238386)); +#2872=CARTESIAN_POINT('',(-19.489470865,-18.711222597,27.116165514)); +#2873=CARTESIAN_POINT('',(-19.509896587,-18.721036608,27.158685021)); +#2874=CARTESIAN_POINT('',(-19.556041471,-18.743210053,27.240028076)); +#2875=CARTESIAN_POINT('',(-19.581760301,-18.755569326,27.278851039)); +#2876=CARTESIAN_POINT('',(-19.637957941,-18.782576828,27.351995694)); +#2877=CARTESIAN_POINT('',(-19.668436348,-18.797224862,27.38631686)); +#2878=CARTESIAN_POINT('',(-19.733520974,-18.828505929,27.449745983)); +#2879=CARTESIAN_POINT('',(-19.768126725,-18.845138737,27.478853484)); +#2880=CARTESIAN_POINT('',(-19.840748274,-18.880044214,27.531251472)); +#2881=CARTESIAN_POINT('',(-19.87876355,-18.898316632,27.554541583)); +#2882=CARTESIAN_POINT('',(-19.957415666,-18.93612217,27.594821642)); +#2883=CARTESIAN_POINT('',(-19.998051941,-18.955655018,27.6118113)); +#2884=CARTESIAN_POINT('',(-20.081103213,-18.995576103,27.63913798)); +#2885=CARTESIAN_POINT('',(-20.123517613,-19.015964053,27.649474804)); +#2886=CARTESIAN_POINT('',(-20.209245405,-19.05717228,27.663281324)); +#2887=CARTESIAN_POINT('',(-20.252558182,-19.077992262,27.666750919)); +#2888=CARTESIAN_POINT('',(-20.29587127,-19.098812394,27.666750919)); +#2889=CARTESIAN_POINT('',(-19.603494797,-18.372836477,27.025274608)); +#2890=CARTESIAN_POINT('',(-19.620303119,-18.37953025,27.072143485)); +#2891=CARTESIAN_POINT('',(-19.640382713,-18.387557526,27.117646557)); +#2892=CARTESIAN_POINT('',(-19.686630933,-18.406095689,27.204898147)); +#2893=CARTESIAN_POINT('',(-19.712799166,-18.416606416,27.24664593)); +#2894=CARTESIAN_POINT('',(-19.770633989,-18.439871648,27.325447188)); +#2895=CARTESIAN_POINT('',(-19.80230009,-18.452625953,27.362499999)); +#2896=CARTESIAN_POINT('',(-19.870416664,-18.48008775,27.431077394)); +#2897=CARTESIAN_POINT('',(-19.906866561,-18.494795006,27.4626014)); +#2898=CARTESIAN_POINT('',(-19.983729464,-18.525827933,27.519411791)); +#2899=CARTESIAN_POINT('',(-20.024141821,-18.542153337,27.544697696)); +#2900=CARTESIAN_POINT('',(-20.108019523,-18.576051191,27.588462911)); +#2901=CARTESIAN_POINT('',(-20.151484161,-18.593623349,27.606941852)); +#2902=CARTESIAN_POINT('',(-20.240487866,-18.629615141,27.636677333)); +#2903=CARTESIAN_POINT('',(-20.286026183,-18.648034467,27.647933622)); +#2904=CARTESIAN_POINT('',(-20.378152186,-18.685301864,27.662970478)); +#2905=CARTESIAN_POINT('',(-20.424739095,-18.704149616,27.666750919)); +#2906=CARTESIAN_POINT('',(-20.471326396,-18.722997529,27.666750919)); +#2907=CARTESIAN_POINT('',(-19.696498881,-18.081326054,26.983781732)); +#2908=CARTESIAN_POINT('',(-19.712216115,-18.08663425,27.03315171)); +#2909=CARTESIAN_POINT('',(-19.731576788,-18.093213045,27.081220209)); +#2910=CARTESIAN_POINT('',(-19.777113703,-18.108750027,27.173593889)); +#2911=CARTESIAN_POINT('',(-19.803289497,-18.117708058,27.217898174)); +#2912=CARTESIAN_POINT('',(-19.861820678,-18.1377834,27.301672596)); +#2913=CARTESIAN_POINT('',(-19.894175492,-18.148900511,27.341141922)); +#2914=CARTESIAN_POINT('',(-19.964280069,-18.173021202,27.414292766)); +#2915=CARTESIAN_POINT('',(-20.002029148,-18.186024541,27.447973576)); +#2916=CARTESIAN_POINT('',(-20.082007864,-18.213598847,27.508733789)); +#2917=CARTESIAN_POINT('',(-20.124236722,-18.228169538,27.535812604)); +#2918=CARTESIAN_POINT('',(-20.212152882,-18.258521465,27.582714811)); +#2919=CARTESIAN_POINT('',(-20.257839329,-18.274302397,27.60253775)); +#2920=CARTESIAN_POINT('',(-20.351565418,-18.306688193,27.634449469)); +#2921=CARTESIAN_POINT('',(-20.39960415,-18.323292732,27.646537939)); +#2922=CARTESIAN_POINT('',(-20.496873006,-18.356919035,27.662688743)); +#2923=CARTESIAN_POINT('',(-20.546102185,-18.373940462,27.666750919)); +#2924=CARTESIAN_POINT('',(-20.595331842,-18.39096206,27.666750919)); +#2925=CARTESIAN_POINT('',(-19.846778314,-17.473493361,26.897264321)); +#2926=CARTESIAN_POINT('',(-19.859407739,-17.476389167,26.951566464)); +#2927=CARTESIAN_POINT('',(-19.876461637,-17.480349363,27.004778056)); +#2928=CARTESIAN_POINT('',(-19.918941451,-17.490285906,27.107543159)); +#2929=CARTESIAN_POINT('',(-19.944366814,-17.49626212,27.157095346)); +#2930=CARTESIAN_POINT('',(-20.002879833,-17.510061343,27.251163997)); +#2931=CARTESIAN_POINT('',(-20.035966731,-17.517884168,27.29567925)); +#2932=CARTESIAN_POINT('',(-20.108880695,-17.535155454,27.378436683)); +#2933=CARTESIAN_POINT('',(-20.148706818,-17.544603687,27.416677798)); +#2934=CARTESIAN_POINT('',(-20.233990304,-17.56485905,27.485824155)); +#2935=CARTESIAN_POINT('',(-20.279446567,-17.575665911,27.516728508)); +#2936=CARTESIAN_POINT('',(-20.37472536,-17.598333693,27.570342514)); +#2937=CARTESIAN_POINT('',(-20.424546662,-17.610194314,27.593051478)); +#2938=CARTESIAN_POINT('',(-20.527169585,-17.634635234,27.629643623)); +#2939=CARTESIAN_POINT('',(-20.579969884,-17.647215211,27.643526334)); +#2940=CARTESIAN_POINT('',(-20.687082281,-17.672740289,27.662080101)); +#2941=CARTESIAN_POINT('',(-20.741393,-17.685685055,27.666750919)); +#2942=CARTESIAN_POINT('',(-20.795704418,-17.698629991,27.666750919)); +#2943=CARTESIAN_POINT('',(-19.904049946,-17.15718612,26.852241926)); +#2944=CARTESIAN_POINT('',(-19.914682252,-17.159055615,26.908974572)); +#2945=CARTESIAN_POINT('',(-19.930147854,-17.161846077,26.964763392)); +#2946=CARTESIAN_POINT('',(-19.970281019,-17.169183952,27.072797143)); +#2947=CARTESIAN_POINT('',(-19.994947981,-17.173731251,27.125040485)); +#2948=CARTESIAN_POINT('',(-20.052745777,-17.184444538,27.224429848)); +#2949=CARTESIAN_POINT('',(-20.085875751,-17.19061036,27.271574408)); +#2950=CARTESIAN_POINT('',(-20.159610668,-17.204373457,27.359364859)); +#2951=CARTESIAN_POINT('',(-20.200214518,-17.211970521,27.400009461)); +#2952=CARTESIAN_POINT('',(-20.287686857,-17.22836557,27.473592159)); +#2953=CARTESIAN_POINT('',(-20.334554052,-17.237163304,27.506529176)); +#2954=CARTESIAN_POINT('',(-20.433157232,-17.255692844,27.563718071)); +#2955=CARTESIAN_POINT('',(-20.484891761,-17.265424364,27.587969111)); +#2956=CARTESIAN_POINT('',(-20.591689607,-17.285526381,27.627065532)); +#2957=CARTESIAN_POINT('',(-20.646751349,-17.295896569,27.641910341)); +#2958=CARTESIAN_POINT('',(-20.758565079,-17.316961502,27.66175318)); +#2959=CARTESIAN_POINT('',(-20.815315419,-17.327655925,27.666750919)); +#2960=CARTESIAN_POINT('',(-20.872066595,-17.338350512,27.666750919)); +#2961=CARTESIAN_POINT('',(-19.980661736,-16.511914374,26.760395532)); +#2962=CARTESIAN_POINT('',(-19.986511805,-16.512335647,26.821726864)); +#2963=CARTESIAN_POINT('',(-19.998013229,-16.51329314,26.882507984)); +#2964=CARTESIAN_POINT('',(-20.031924967,-16.516246239,27.00091523)); +#2965=CARTESIAN_POINT('',(-20.054334621,-16.518241783,27.058539089)); +#2966=CARTESIAN_POINT('',(-20.109299784,-16.523200617,27.168680097)); +#2967=CARTESIAN_POINT('',(-20.141854232,-16.526163806,27.22119514)); +#2968=CARTESIAN_POINT('',(-20.216003092,-16.532954022,27.319340234)); +#2969=CARTESIAN_POINT('',(-20.257596079,-16.536780911,27.364968408)); +#2970=CARTESIAN_POINT('',(-20.348410714,-16.545164698,27.447794919)); +#2971=CARTESIAN_POINT('',(-20.397630619,-16.549721426,27.484991674)); +#2972=CARTESIAN_POINT('',(-20.502030099,-16.559405781,27.549696065)); +#2973=CARTESIAN_POINT('',(-20.557207672,-16.564533212,27.577202464)); +#2974=CARTESIAN_POINT('',(-20.67165221,-16.575180099,27.621594901)); +#2975=CARTESIAN_POINT('',(-20.730916982,-16.580699339,27.63848009)); +#2976=CARTESIAN_POINT('',(-20.851527534,-16.591937402,27.661058315)); +#2977=CARTESIAN_POINT('',(-20.912871004,-16.597655997,27.666750919)); +#2978=CARTESIAN_POINT('',(-20.974215648,-16.603374708,27.666750919)); +#2979=CARTESIAN_POINT('',(-20.,-16.182965825,26.713573805)); +#2980=CARTESIAN_POINT('',(-20.003064551,-16.182965825,26.777072698)); +#2981=CARTESIAN_POINT('',(-20.012189597,-16.183260609,26.84026839)); +#2982=CARTESIAN_POINT('',(-20.042225552,-16.184428447,26.963779687)); +#2983=CARTESIAN_POINT('',(-20.063135793,-16.185301472,27.024092617)); +#2984=CARTESIAN_POINT('',(-20.115982656,-16.187592268,27.139664144)); +#2985=CARTESIAN_POINT('',(-20.147918118,-16.189009983,27.194920239)); +#2986=CARTESIAN_POINT('',(-20.221659409,-16.192335703,27.298386823)); +#2987=CARTESIAN_POINT('',(-20.263463628,-16.194243627,27.346595075)); +#2988=CARTESIAN_POINT('',(-20.355431589,-16.198476466,27.434229106)); +#2989=CARTESIAN_POINT('',(-20.405593329,-16.200801277,27.473652992)); +#2990=CARTESIAN_POINT('',(-20.51246506,-16.20577857,27.542298122)); +#2991=CARTESIAN_POINT('',(-20.569172728,-16.208430928,27.571517882)); +#2992=CARTESIAN_POINT('',(-20.68708976,-16.213961399,27.618702193)); +#2993=CARTESIAN_POINT('',(-20.748296565,-16.216839375,27.636665725)); +#2994=CARTESIAN_POINT('',(-20.873003591,-16.222710492,27.660690347)); +#2995=CARTESIAN_POINT('',(-20.936501107,-16.225703488,27.666750919)); +#2996=CARTESIAN_POINT('',(-21.,-16.228696557,27.666750919)); +#2997=CARTESIAN_POINT('',(-20.,-15.854009142,26.666750919)); +#2998=CARTESIAN_POINT('',(-20.,-15.854009142,26.732200766)); +#2999=CARTESIAN_POINT('',(-20.006446088,-15.854009142,26.797648995)); +#3000=CARTESIAN_POINT('',(-20.031983351,-15.854009142,26.926033488)); +#3001=CARTESIAN_POINT('',(-20.051073895,-15.854009142,26.988966578)); +#3002=CARTESIAN_POINT('',(-20.10116704,-15.854009142,27.109902126)); +#3003=CARTESIAN_POINT('',(-20.132168401,-15.854009142,27.167901593)); +#3004=CARTESIAN_POINT('',(-20.204892374,-15.854009142,27.276740711)); +#3005=CARTESIAN_POINT('',(-20.246613188,-15.854009142,27.32757767)); +#3006=CARTESIAN_POINT('',(-20.339173249,-15.854009142,27.420137731)); +#3007=CARTESIAN_POINT('',(-20.390010208,-15.854009142,27.461858545)); +#3008=CARTESIAN_POINT('',(-20.498849326,-15.854009142,27.534582518)); +#3009=CARTESIAN_POINT('',(-20.556848794,-15.854009142,27.56558388)); +#3010=CARTESIAN_POINT('',(-20.677784342,-15.854009142,27.615677024)); +#3011=CARTESIAN_POINT('',(-20.740717431,-15.854009142,27.634767568)); +#3012=CARTESIAN_POINT('',(-20.869101924,-15.854009142,27.660304831)); +#3013=CARTESIAN_POINT('',(-20.934550153,-15.854009142,27.666750919)); +#3014=CARTESIAN_POINT('',(-21.,-15.854009142,27.666750919)); +#3015=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#2835,#2836,#2837,#2838,#2839,#2840,#2841,#2842,#2843,#2844,#2845,#2846,#2847,#2848,#2849,#2850,#2851,#2852),(#2853,#2854,#2855,#2856,#2857,#2858,#2859,#2860,#2861,#2862,#2863,#2864,#2865,#2866,#2867,#2868,#2869,#2870),(#2871,#2872,#2873,#2874,#2875,#2876,#2877,#2878,#2879,#2880,#2881,#2882,#2883,#2884,#2885,#2886,#2887,#2888),(#2889,#2890,#2891,#2892,#2893,#2894,#2895,#2896,#2897,#2898,#2899,#2900,#2901,#2902,#2903,#2904,#2905,#2906),(#2907,#2908,#2909,#2910,#2911,#2912,#2913,#2914,#2915,#2916,#2917,#2918,#2919,#2920,#2921,#2922,#2923,#2924),(#2925,#2926,#2927,#2928,#2929,#2930,#2931,#2932,#2933,#2934,#2935,#2936,#2937,#2938,#2939,#2940,#2941,#2942),(#2943,#2944,#2945,#2946,#2947,#2948,#2949,#2950,#2951,#2952,#2953,#2954,#2955,#2956,#2957,#2958,#2959,#2960),(#2961,#2962,#2963,#2964,#2965,#2966,#2967,#2968,#2969,#2970,#2971,#2972,#2973,#2974,#2975,#2976,#2977,#2978),(#2979,#2980,#2981,#2982,#2983,#2984,#2985,#2986,#2987,#2988,#2989,#2990,#2991,#2992,#2993,#2994,#2995,#2996),(#2997,#2998,#2999,#3000,#3001,#3002,#3003,#3004,#3005,#3006,#3007,#3008,#3009,#3010,#3011,#3012,#3013,#3014)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,4),(4,2,2,2,2,2,2,2,4),(4.082831737,4.123340358,4.319689899,4.51603944,4.71238898),(0.,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1.),.UNSPECIFIED.); +#3016=ORIENTED_EDGE('',*,*,#2829,.T.); +#3017=ORIENTED_EDGE('',*,*,#1713,.F.); +#3018=CARTESIAN_POINT('',(-21.,-15.854009142,26.666750919)); +#3019=DIRECTION('',(0.,1.,0.)); +#3020=DIRECTION('',(0.,-0.,1.)); +#3021=AXIS2_PLACEMENT_3D('',#3018,#3019,#3020); +#3022=CIRCLE('',#3021,1.); +#3023=EDGE_CURVE('',#964,#136,#3022,.T.); +#3024=ORIENTED_EDGE('',*,*,#3023,.F.); +#3025=ORIENTED_EDGE('',*,*,#970,.F.); +#3026=EDGE_LOOP('',(#3016,#3017,#3024,#3025)); +#3027=FACE_BOUND('',#3026,.T.); +#3028=ADVANCED_FACE('',(#3027),#3015,.T.); +#3029=CARTESIAN_POINT('',(-21.,-5.67149291,26.666750919)); +#3030=DIRECTION('',(0.,1.,0.)); +#3031=DIRECTION('',(0.,-0.,1.)); +#3032=AXIS2_PLACEMENT_3D('',#3029,#3030,#3031); +#3033=CYLINDRICAL_SURFACE('',#3032,1.); +#3034=ORIENTED_EDGE('',*,*,#3023,.T.); +#3035=ORIENTED_EDGE('',*,*,#141,.F.); +#3036=CARTESIAN_POINT('',(-21.,5.485205765,26.666750919)); +#3037=DIRECTION('',(0.,1.,0.)); +#3038=DIRECTION('',(0.,-0.,1.)); +#3039=AXIS2_PLACEMENT_3D('',#3036,#3037,#3038); +#3040=CIRCLE('',#3039,1.); +#3041=EDGE_CURVE('',#973,#127,#3040,.T.); +#3042=ORIENTED_EDGE('',*,*,#3041,.F.); +#3043=ORIENTED_EDGE('',*,*,#978,.F.); +#3044=EDGE_LOOP('',(#3034,#3035,#3042,#3043)); +#3045=FACE_BOUND('',#3044,.T.); +#3046=ADVANCED_FACE('',(#3045),#3033,.T.); +#3047=CARTESIAN_POINT('',(-21.,5.485205765,17.666750919)); +#3048=DIRECTION('',(-1.,0.,0.)); +#3049=DIRECTION('',(0.,0.,1.)); +#3050=AXIS2_PLACEMENT_3D('',#3047,#3048,#3049); +#3051=TOROIDAL_SURFACE('',#3050,9.,1.); +#3052=ORIENTED_EDGE('',*,*,#3041,.T.); +#3053=ORIENTED_EDGE('',*,*,#133,.F.); +#3054=CARTESIAN_POINT('',(-21.,12.062407326,23.810074094)); +#3055=DIRECTION('',(-0.,0.682591464,-0.730800173)); +#3056=DIRECTION('',(-0.,0.730800173,0.682591464)); +#3057=AXIS2_PLACEMENT_3D('',#3054,#3055,#3056); +#3058=CIRCLE('',#3057,1.); +#3059=EDGE_CURVE('',#1013,#119,#3058,.T.); +#3060=ORIENTED_EDGE('',*,*,#3059,.F.); +#3061=ORIENTED_EDGE('',*,*,#1420,.F.); +#3062=EDGE_LOOP('',(#3052,#3053,#3060,#3061)); +#3063=FACE_BOUND('',#3062,.T.); +#3064=ADVANCED_FACE('',(#3063),#3051,.T.); +#3065=CARTESIAN_POINT('',(-20.,28.001846852,8.)); +#3066=CARTESIAN_POINT('',(-20.,28.071608366,8.110761279)); +#3067=CARTESIAN_POINT('',(-20.026027323,28.141342432,8.221478979)); +#3068=CARTESIAN_POINT('',(-20.126213612,28.270244902,8.426139137)); +#3069=CARTESIAN_POINT('',(-20.200333158,28.329362588,8.520001071)); +#3070=CARTESIAN_POINT('',(-20.38545328,28.428020268,8.676641174)); +#3071=CARTESIAN_POINT('',(-20.49638102,28.467521443,8.739357713)); +#3072=CARTESIAN_POINT('',(-20.738252116,28.520914594,8.824130726)); +#3073=CARTESIAN_POINT('',(-20.869100306,28.534785562,8.846153846)); +#3074=CARTESIAN_POINT('',(-21.,28.534785562,8.846153846)); +#3075=CARTESIAN_POINT('',(-20.,28.54589502,7.74300389)); +#3076=CARTESIAN_POINT('',(-20.009488406,28.609698247,7.850379136)); +#3077=CARTESIAN_POINT('',(-20.042568734,28.673481419,7.955490509)); +#3078=CARTESIAN_POINT('',(-20.151281035,28.792341975,8.146847814)); +#3079=CARTESIAN_POINT('',(-20.226877483,28.847381921,8.233033264)); +#3080=CARTESIAN_POINT('',(-20.410164355,28.941188965,8.374703523)); +#3081=CARTESIAN_POINT('',(-20.517796058,28.979926292,8.430143925)); +#3082=CARTESIAN_POINT('',(-20.750321281,29.035766894,8.502731664)); +#3083=CARTESIAN_POINT('',(-20.875140813,29.052852062,8.519856574)); +#3084=CARTESIAN_POINT('',(-21.,29.057908801,8.516671654)); +#3085=CARTESIAN_POINT('',(-19.967596458,29.095333744,7.504526185)); +#3086=CARTESIAN_POINT('',(-19.984988813,29.154137774,7.606773208)); +#3087=CARTESIAN_POINT('',(-20.023509229,29.212926405,7.705310781)); +#3088=CARTESIAN_POINT('',(-20.137955528,29.323190877,7.882754212)); +#3089=CARTESIAN_POINT('',(-20.213850893,29.374637817,7.961613616)); +#3090=CARTESIAN_POINT('',(-20.393525767,29.463781871,8.089850202)); +#3091=CARTESIAN_POINT('',(-20.497257823,29.501455542,8.139193917)); +#3092=CARTESIAN_POINT('',(-20.719620298,29.558321245,8.202238368)); +#3093=CARTESIAN_POINT('',(-20.838192196,29.577498185,8.21592274)); +#3094=CARTESIAN_POINT('',(-20.956795278,29.586215266,8.210931006)); +#3095=CARTESIAN_POINT('',(-19.858442583,30.207052357,7.061155477)); +#3096=CARTESIAN_POINT('',(-19.888510382,30.25697186,7.151686237)); +#3097=CARTESIAN_POINT('',(-19.935107276,30.306882813,7.236610556)); +#3098=CARTESIAN_POINT('',(-20.056564175,30.401651467,7.386668707)); +#3099=CARTESIAN_POINT('',(-20.131402732,30.446492904,7.451776851)); +#3100=CARTESIAN_POINT('',(-20.30167876,30.526557561,7.555594065)); +#3101=CARTESIAN_POINT('',(-20.397086594,30.56176695,7.594285486)); +#3102=CARTESIAN_POINT('',(-20.598765688,30.618965465,7.641351388)); +#3103=CARTESIAN_POINT('',(-20.705002059,30.640944557,7.649717978)); +#3104=CARTESIAN_POINT('',(-20.811256778,30.65517547,7.642507021)); +#3105=CARTESIAN_POINT('',(-19.781438541,30.769301281,6.856297106)); +#3106=CARTESIAN_POINT('',(-19.816291516,30.815346057,6.940218135)); +#3107=CARTESIAN_POINT('',(-19.865531892,30.861384423,7.018084506)); +#3108=CARTESIAN_POINT('',(-19.988267259,30.949268814,7.154648107)); +#3109=CARTESIAN_POINT('',(-20.061744928,30.991102597,7.213326395)); +#3110=CARTESIAN_POINT('',(-20.226214986,31.066751924,7.306162875)); +#3111=CARTESIAN_POINT('',(-20.317184321,31.1005569,7.340308221)); +#3112=CARTESIAN_POINT('',(-20.508310491,31.157048345,7.38096643)); +#3113=CARTESIAN_POINT('',(-20.608440616,31.17972687,7.387473694)); +#3114=CARTESIAN_POINT('',(-20.708584724,31.195799437,7.379868084)); +#3115=CARTESIAN_POINT('',(-19.640950142,31.62323173,6.572941307)); +#3116=CARTESIAN_POINT('',(-19.68090074,31.663996561,6.646706573)); +#3117=CARTESIAN_POINT('',(-19.732372151,31.704757298,6.714203979)); +#3118=CARTESIAN_POINT('',(-19.854377742,31.783130863,6.831466455)); +#3119=CARTESIAN_POINT('',(-19.924899604,31.820735819,6.881219769)); +#3120=CARTESIAN_POINT('',(-20.079539498,31.88988442,6.959142083)); +#3121=CARTESIAN_POINT('',(-20.163641957,31.921421112,6.987303281)); +#3122=CARTESIAN_POINT('',(-20.338927261,31.975987185,7.019860262)); +#3123=CARTESIAN_POINT('',(-20.430092476,31.999011065,7.024252793)); +#3124=CARTESIAN_POINT('',(-20.521266858,32.016886406,7.016591418)); +#3125=CARTESIAN_POINT('',(-19.58991083,31.909631618,6.482488102)); +#3126=CARTESIAN_POINT('',(-19.631215003,31.948727127,6.552823368)); +#3127=CARTESIAN_POINT('',(-19.683140857,31.987819158,6.616897229)); +#3128=CARTESIAN_POINT('',(-19.804460218,32.063161269,6.727878644)); +#3129=CARTESIAN_POINT('',(-19.873842891,32.099404644,6.77477634)); +#3130=CARTESIAN_POINT('',(-20.025015779,32.16640695,6.847988182)); +#3131=CARTESIAN_POINT('',(-20.106792516,32.197159913,6.87429583)); +#3132=CARTESIAN_POINT('',(-20.276791793,32.250937282,6.904409561)); +#3133=CARTESIAN_POINT('',(-20.364999189,32.27395689,6.908212975)); +#3134=CARTESIAN_POINT('',(-20.453214441,32.292270914,6.900625772)); +#3135=CARTESIAN_POINT('',(-19.480437082,32.486085553,6.309463886)); +#3136=CARTESIAN_POINT('',(-19.523806142,32.521988278,6.372955403)); +#3137=CARTESIAN_POINT('',(-19.576117996,32.557888536,6.430314874)); +#3138=CARTESIAN_POINT('',(-19.695275725,32.627391491,6.529110182)); +#3139=CARTESIAN_POINT('',(-19.762113368,32.660989411,6.570539247)); +#3140=CARTESIAN_POINT('',(-19.906030552,32.723731801,6.634818355)); +#3141=CARTESIAN_POINT('',(-19.983100175,32.752871952,6.657663998)); +#3142=CARTESIAN_POINT('',(-20.142535107,32.804827137,6.683311608)); +#3143=CARTESIAN_POINT('',(-20.224889441,32.827638586,6.686111824)); +#3144=CARTESIAN_POINT('',(-20.307249443,32.846553544,6.678799854)); +#3145=CARTESIAN_POINT('',(-19.421868781,32.776726576,6.22674695)); +#3146=CARTESIAN_POINT('',(-19.465949222,32.811103162,6.286817971)); +#3147=CARTESIAN_POINT('',(-19.518191386,32.845477679,6.340880324)); +#3148=CARTESIAN_POINT('',(-19.635869051,32.912167885,6.433759644)); +#3149=CARTESIAN_POINT('',(-19.701297444,32.944479557,6.472571031)); +#3150=CARTESIAN_POINT('',(-19.841417585,33.005104182,6.532620594)); +#3151=CARTESIAN_POINT('',(-19.916100881,33.03341348,6.553855164)); +#3152=CARTESIAN_POINT('',(-20.070246841,33.08433252,6.577476913)); +#3153=CARTESIAN_POINT('',(-20.149700213,33.106939189,6.579862676)); +#3154=CARTESIAN_POINT('',(-20.229158375,33.126016066,6.5727525)); +#3155=CARTESIAN_POINT('',(-19.237887344,33.647222554,5.992175475)); +#3156=CARTESIAN_POINT('',(-19.283209482,33.677232219,6.04222076)); +#3157=CARTESIAN_POINT('',(-19.334547698,33.707240777,6.086747219)); +#3158=CARTESIAN_POINT('',(-19.446781066,33.765828687,6.162660936)); +#3159=CARTESIAN_POINT('',(-19.50767197,33.794405874,6.194045453)); +#3160=CARTESIAN_POINT('',(-19.63608434,33.848765595,6.242192168)); +#3161=CARTESIAN_POINT('',(-19.703601,33.874546108,6.258952639)); +#3162=CARTESIAN_POINT('',(-19.842030926,33.922076185,6.277061324)); +#3163=CARTESIAN_POINT('',(-19.912939043,33.94382396,6.278408898)); +#3164=CARTESIAN_POINT('',(-19.983849792,33.963031429,6.27201984)); +#3165=CARTESIAN_POINT('',(-19.104023183,34.227247455,5.85330693)); +#3166=CARTESIAN_POINT('',(-19.148997216,34.254615096,5.896969411)); +#3167=CARTESIAN_POINT('',(-19.198815495,34.281981978,5.935596044)); +#3168=CARTESIAN_POINT('',(-19.306087775,34.335594166,6.001207815)); +#3169=CARTESIAN_POINT('',(-19.363538778,34.361837985,6.02819116)); +#3170=CARTESIAN_POINT('',(-19.483710413,34.412126154,6.069417129)); +#3171=CARTESIAN_POINT('',(-19.5464277,34.436169108,6.083658628)); +#3172=CARTESIAN_POINT('',(-19.674553176,34.481066321,6.098821072)); +#3173=CARTESIAN_POINT('',(-19.739957806,34.501919328,6.099741604)); +#3174=CARTESIAN_POINT('',(-19.805364252,34.520747681,6.093983237)); +#3175=CARTESIAN_POINT('',(-18.678216116,35.969634528,5.485162143)); +#3176=CARTESIAN_POINT('',(-18.719440238,35.989589867,5.511246186)); +#3177=CARTESIAN_POINT('',(-18.762664501,36.009545143,5.533876901)); +#3178=CARTESIAN_POINT('',(-18.852153456,36.049047453,5.571829704)); +#3179=CARTESIAN_POINT('',(-18.898417716,36.068594357,5.587151802)); +#3180=CARTESIAN_POINT('',(-18.992991549,36.106875384,5.610221905)); +#3181=CARTESIAN_POINT('',(-19.041300731,36.125609365,5.617969928)); +#3182=CARTESIAN_POINT('',(-19.13894729,36.161867901,5.625762453)); +#3183=CARTESIAN_POINT('',(-19.188284303,36.179392295,5.625806973)); +#3184=CARTESIAN_POINT('',(-19.237621494,36.196119866,5.62200274)); +#3185=CARTESIAN_POINT('',(-18.362411557,37.134365521,5.303962851)); +#3186=CARTESIAN_POINT('',(-18.397546444,37.150052172,5.32045691)); +#3187=CARTESIAN_POINT('',(-18.433685618,37.165738782,5.334709057)); +#3188=CARTESIAN_POINT('',(-18.507491737,37.19690561,5.358553728)); +#3189=CARTESIAN_POINT('',(-18.545158488,37.212385747,5.368146198)); +#3190=CARTESIAN_POINT('',(-18.621520644,37.242935574,5.382553234)); +#3191=CARTESIAN_POINT('',(-18.66021585,37.258005185,5.387367767)); +#3192=CARTESIAN_POINT('',(-18.738123726,37.287534718,5.392159652)); +#3193=CARTESIAN_POINT('',(-18.777336194,37.301994562,5.392136994)); +#3194=CARTESIAN_POINT('',(-18.816548763,37.316053517,5.389695945)); +#3195=CARTESIAN_POINT('',(-17.864796834,38.895464433,5.121923933)); +#3196=CARTESIAN_POINT('',(-17.888136684,38.905095237,5.12864173)); +#3197=CARTESIAN_POINT('',(-17.911731643,38.914726039,5.134410322)); +#3198=CARTESIAN_POINT('',(-17.959305567,38.933937036,5.144023532)); +#3199=CARTESIAN_POINT('',(-17.98328452,38.943517226,5.147868149)); +#3200=CARTESIAN_POINT('',(-18.03149906,38.962576535,5.153616464)); +#3201=CARTESIAN_POINT('',(-18.055734634,38.972055647,5.15552016)); +#3202=CARTESIAN_POINT('',(-18.104334294,38.990862624,5.157378305)); +#3203=CARTESIAN_POINT('',(-18.128698366,39.000190483,5.157332752)); +#3204=CARTESIAN_POINT('',(-18.153062445,39.009417849,5.15631272)); +#3205=CARTESIAN_POINT('',(-17.694813089,39.4848025,5.076313522)); +#3206=CARTESIAN_POINT('',(-17.713771803,39.492477166,5.08052868)); +#3207=CARTESIAN_POINT('',(-17.732858261,39.500151831,5.084144508)); +#3208=CARTESIAN_POINT('',(-17.771223466,39.515475816,5.090166346)); +#3209=CARTESIAN_POINT('',(-17.790502206,39.523125134,5.092572356)); +#3210=CARTESIAN_POINT('',(-17.829188194,39.538373149,5.096167135)); +#3211=CARTESIAN_POINT('',(-17.848595437,39.545971845,5.097355903)); +#3212=CARTESIAN_POINT('',(-17.887474273,39.561093493,5.098512531)); +#3213=CARTESIAN_POINT('',(-17.906945861,39.568616443,5.098480392)); +#3214=CARTESIAN_POINT('',(-17.926417452,39.57608907,5.097837849)); +#3215=CARTESIAN_POINT('',(-17.435971844,40.373350675,5.030554679)); +#3216=CARTESIAN_POINT('',(-17.447996575,40.378126794,5.032248667)); +#3217=CARTESIAN_POINT('',(-17.460053381,40.382902912,5.033699564)); +#3218=CARTESIAN_POINT('',(-17.48421515,40.39244884,5.036113577)); +#3219=CARTESIAN_POINT('',(-17.496320112,40.397218649,5.037076693)); +#3220=CARTESIAN_POINT('',(-17.520562161,40.406745655,5.03851408)); +#3221=CARTESIAN_POINT('',(-17.532699246,40.411502851,5.038988352)); +#3222=CARTESIAN_POINT('',(-17.556989485,40.420998335,5.039447529)); +#3223=CARTESIAN_POINT('',(-17.569142638,40.425736622,5.039432434)); +#3224=CARTESIAN_POINT('',(-17.581295792,40.430462315,5.039172665)); +#3225=CARTESIAN_POINT('',(-17.348992519,40.670466956,5.019085013)); +#3226=CARTESIAN_POINT('',(-17.358644009,40.674282362,5.020143765)); +#3227=CARTESIAN_POINT('',(-17.368311517,40.678097767,5.021050351)); +#3228=CARTESIAN_POINT('',(-17.387670584,40.685725427,5.022558493)); +#3229=CARTESIAN_POINT('',(-17.397362141,40.689537682,5.02316005)); +#3230=CARTESIAN_POINT('',(-17.416761299,40.697155892,5.024057669)); +#3231=CARTESIAN_POINT('',(-17.426468899,40.700961847,5.024353732)); +#3232=CARTESIAN_POINT('',(-17.445892124,40.708564316,5.024640136)); +#3233=CARTESIAN_POINT('',(-17.455607748,40.712360828,5.024630477)); +#3234=CARTESIAN_POINT('',(-17.465323372,40.716151051,5.024467961)); +#3235=CARTESIAN_POINT('',(-17.174732277,41.264278325,5.003815996)); +#3236=CARTESIAN_POINT('',(-17.179585951,41.266182087,5.004028214)); +#3237=CARTESIAN_POINT('',(-17.184439627,41.268085849,5.004209747)); +#3238=CARTESIAN_POINT('',(-17.194146979,41.271893375,5.004511541)); +#3239=CARTESIAN_POINT('',(-17.199000655,41.273797139,5.004631802)); +#3240=CARTESIAN_POINT('',(-17.208708002,41.27760467,5.00481112)); +#3241=CARTESIAN_POINT('',(-17.213561675,41.279508437,5.004870176)); +#3242=CARTESIAN_POINT('',(-17.223269017,41.283315973,5.004927117)); +#3243=CARTESIAN_POINT('',(-17.228122687,41.285219743,5.004925002)); +#3244=CARTESIAN_POINT('',(-17.232976357,41.287123513,5.0048923)); +#3245=CARTESIAN_POINT('',(-17.087381297,41.561214179,5.)); +#3246=CARTESIAN_POINT('',(-17.087381297,41.561214179,5.)); +#3247=CARTESIAN_POINT('',(-17.094663029,41.564070309,5.)); +#3248=CARTESIAN_POINT('',(-17.094663029,41.564070309,5.)); +#3249=CARTESIAN_POINT('',(-17.101944762,41.566926438,5.)); +#3250=CARTESIAN_POINT('',(-17.101944762,41.566926438,5.)); +#3251=CARTESIAN_POINT('',(-17.109226495,41.569782568,5.)); +#3252=CARTESIAN_POINT('',(-17.109226495,41.569782568,5.)); +#3253=CARTESIAN_POINT('',(-17.116508227,41.572638698,5.)); +#3254=CARTESIAN_POINT('',(-17.116508227,41.572638698,5.)); +#3255=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3256=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3257=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3258=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3259=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3260=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3261=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3262=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3263=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3264=CARTESIAN_POINT('',(-17.,41.858253313,5.)); +#3265=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3065,#3066,#3067,#3068,#3069,#3070,#3071,#3072,#3073,#3074),(#3075,#3076,#3077,#3078,#3079,#3080,#3081,#3082,#3083,#3084),(#3085,#3086,#3087,#3088,#3089,#3090,#3091,#3092,#3093,#3094),(#3095,#3096,#3097,#3098,#3099,#3100,#3101,#3102,#3103,#3104),(#3105,#3106,#3107,#3108,#3109,#3110,#3111,#3112,#3113,#3114),(#3115,#3116,#3117,#3118,#3119,#3120,#3121,#3122,#3123,#3124),(#3125,#3126,#3127,#3128,#3129,#3130,#3131,#3132,#3133,#3134),(#3135,#3136,#3137,#3138,#3139,#3140,#3141,#3142,#3143,#3144),(#3145,#3146,#3147,#3148,#3149,#3150,#3151,#3152,#3153,#3154),(#3155,#3156,#3157,#3158,#3159,#3160,#3161,#3162,#3163,#3164),(#3165,#3166,#3167,#3168,#3169,#3170,#3171,#3172,#3173,#3174),(#3175,#3176,#3177,#3178,#3179,#3180,#3181,#3182,#3183,#3184),(#3185,#3186,#3187,#3188,#3189,#3190,#3191,#3192,#3193,#3194),(#3195,#3196,#3197,#3198,#3199,#3200,#3201,#3202,#3203,#3204),(#3205,#3206,#3207,#3208,#3209,#3210,#3211,#3212,#3213,#3214),(#3215,#3216,#3217,#3218,#3219,#3220,#3221,#3222,#3223,#3224),(#3225,#3226,#3227,#3228,#3229,#3230,#3231,#3232,#3233,#3234),(#3235,#3236,#3237,#3238,#3239,#3240,#3241,#3242,#3243,#3244),(#3245,#3246,#3247,#3248,#3249,#3250,#3251,#3252,#3253,#3254),(#3255,#3256,#3257,#3258,#3259,#3260,#3261,#3262,#3263,#3264)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.014249141,0.015199084),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#3266=ORIENTED_EDGE('',*,*,#1688,.F.); +#3267=ORIENTED_EDGE('',*,*,#1498,.F.); +#3268=CARTESIAN_POINT('',(-21.,28.001846852,8.)); +#3269=DIRECTION('',(0.,-0.846153846,0.53293871)); +#3270=DIRECTION('',(0.,-0.53293871,-0.846153846)); +#3271=AXIS2_PLACEMENT_3D('',#3268,#3269,#3270); +#3272=CIRCLE('',#3271,1.); +#3273=EDGE_CURVE('',#102,#1464,#3272,.T.); +#3274=ORIENTED_EDGE('',*,*,#3273,.F.); +#3275=EDGE_LOOP('',(#3266,#3267,#3274)); +#3276=FACE_BOUND('',#3275,.T.); +#3277=ADVANCED_FACE('',(#3276),#3265,.T.); +#3278=CARTESIAN_POINT('',(-21.,19.683453372,15.650783996)); +#3279=DIRECTION('',(0.,0.682591464,-0.730800173)); +#3280=DIRECTION('',(0.,0.730800173,0.682591464)); +#3281=AXIS2_PLACEMENT_3D('',#3278,#3279,#3280); +#3282=CYLINDRICAL_SURFACE('',#3281,1.); +#3283=ORIENTED_EDGE('',*,*,#3059,.T.); +#3284=ORIENTED_EDGE('',*,*,#124,.F.); +#3285=CARTESIAN_POINT('',(-21.,22.857448803,12.25262194)); +#3286=DIRECTION('',(-0.,0.682591464,-0.730800173)); +#3287=DIRECTION('',(-0.,0.730800173,0.682591464)); +#3288=AXIS2_PLACEMENT_3D('',#3285,#3286,#3287); +#3289=CIRCLE('',#3288,1.); +#3290=EDGE_CURVE('',#1021,#110,#3289,.T.); +#3291=ORIENTED_EDGE('',*,*,#3290,.F.); +#3292=ORIENTED_EDGE('',*,*,#1026,.F.); +#3293=EDGE_LOOP('',(#3283,#3284,#3291,#3292)); +#3294=FACE_BOUND('',#3293,.T.); +#3295=ADVANCED_FACE('',(#3294),#3282,.T.); +#3296=CARTESIAN_POINT('',(-21.,41.858253313,30.)); +#3297=DIRECTION('',(-1.,0.,0.)); +#3298=DIRECTION('',(0.,0.,1.)); +#3299=AXIS2_PLACEMENT_3D('',#3296,#3297,#3298); +#3300=TOROIDAL_SURFACE('',#3299,26.,1.); +#3301=ORIENTED_EDGE('',*,*,#3273,.T.); +#3302=ORIENTED_EDGE('',*,*,#1470,.F.); +#3303=ORIENTED_EDGE('',*,*,#3290,.T.); +#3304=ORIENTED_EDGE('',*,*,#116,.F.); +#3305=EDGE_LOOP('',(#3301,#3302,#3303,#3304)); +#3306=FACE_BOUND('',#3305,.T.); +#3307=ADVANCED_FACE('',(#3306),#3300,.T.); +#3308=CARTESIAN_POINT('',(19.424865983,-18.813301404,27.087969303)); +#3309=CARTESIAN_POINT('',(19.460403428,-18.83138884,27.17382872)); +#3310=CARTESIAN_POINT('',(19.506875188,-18.855041498,27.253978732)); +#3311=CARTESIAN_POINT('',(19.617983866,-18.911592303,27.396472548)); +#3312=CARTESIAN_POINT('',(19.682608783,-18.944484343,27.45880096)); +#3313=CARTESIAN_POINT('',(19.824849615,-19.01688043,27.560653656)); +#3314=CARTESIAN_POINT('',(19.902450167,-19.056376659,27.600166937)); +#3315=CARTESIAN_POINT('',(20.06442732,-19.13881791,27.653218434)); +#3316=CARTESIAN_POINT('',(20.148786426,-19.181754028,27.666750919)); +#3317=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919)); +#3318=CARTESIAN_POINT('',(19.352050062,-18.98077405,27.111806948)); +#3319=CARTESIAN_POINT('',(19.389478613,-18.996413074,27.192996945)); +#3320=CARTESIAN_POINT('',(19.436584705,-19.017460263,27.268641018)); +#3321=CARTESIAN_POINT('',(19.546706617,-19.068850762,27.403341384)); +#3322=CARTESIAN_POINT('',(19.609712563,-19.09918955,27.462385719)); +#3323=CARTESIAN_POINT('',(19.747022556,-19.166954887,27.55957127)); +#3324=CARTESIAN_POINT('',(19.821314357,-19.204375435,27.597703841)); +#3325=CARTESIAN_POINT('',(19.975766472,-19.283572473,27.650272131)); +#3326=CARTESIAN_POINT('',(20.055913049,-19.325341908,27.664703136)); +#3327=CARTESIAN_POINT('',(20.136066749,-19.367760489,27.666750919)); +#3328=CARTESIAN_POINT('',(19.276760001,-19.146134608,27.146888636)); +#3329=CARTESIAN_POINT('',(19.315547337,-19.159774261,27.223210658)); +#3330=CARTESIAN_POINT('',(19.36287698,-19.178579319,27.294237237)); +#3331=CARTESIAN_POINT('',(19.471463721,-19.225277838,27.420987808)); +#3332=CARTESIAN_POINT('',(19.532712716,-19.253167859,27.47670241)); +#3333=CARTESIAN_POINT('',(19.665046288,-19.316182906,27.569112694)); +#3334=CARTESIAN_POINT('',(19.736121022,-19.351303274,27.605801519)); +#3335=CARTESIAN_POINT('',(19.883362577,-19.426441036,27.657707868)); +#3336=CARTESIAN_POINT('',(19.959518462,-19.466452863,27.672921518)); +#3337=CARTESIAN_POINT('',(20.035680002,-19.507579233,27.676886562)); +#3338=CARTESIAN_POINT('',(19.124421689,-19.474768808,27.238037281)); +#3339=CARTESIAN_POINT('',(19.164990789,-19.484833672,27.304585295)); +#3340=CARTESIAN_POINT('',(19.212092048,-19.499494037,27.366424274)); +#3341=CARTESIAN_POINT('',(19.31677459,-19.537213456,27.477317563)); +#3342=CARTESIAN_POINT('',(19.374350632,-19.560270669,27.526366394)); +#3343=CARTESIAN_POINT('',(19.49682329,-19.613528998,27.608996297)); +#3344=CARTESIAN_POINT('',(19.561713806,-19.643727496,27.642573276)); +#3345=CARTESIAN_POINT('',(19.695260252,-19.709620398,27.692417751)); +#3346=CARTESIAN_POINT('',(19.763909549,-19.745311545,27.708682754)); +#3347=CARTESIAN_POINT('',(19.832562253,-19.782774395,27.715842646)); +#3348=CARTESIAN_POINT('',(19.047322711,-19.638010157,27.294090579)); +#3349=CARTESIAN_POINT('',(19.088315608,-19.646501986,27.355729598)); +#3350=CARTESIAN_POINT('',(19.134965101,-19.659261829,27.41299586)); +#3351=CARTESIAN_POINT('',(19.23727764,-19.6926971,27.515978204)); +#3352=CARTESIAN_POINT('',(19.292936542,-19.713371201,27.561690155)); +#3353=CARTESIAN_POINT('',(19.410521399,-19.761623833,27.639315588)); +#3354=CARTESIAN_POINT('',(19.472442605,-19.789200439,27.671225951)); +#3355=CARTESIAN_POINT('',(19.59949962,-19.849906622,27.719675718)); +#3356=CARTESIAN_POINT('',(19.664630304,-19.883033769,27.736213163)); +#3357=CARTESIAN_POINT('',(19.729763615,-19.91812436,27.744655131)); +#3358=CARTESIAN_POINT('',(18.93340944,-19.883248129,27.394795572)); +#3359=CARTESIAN_POINT('',(18.974497511,-19.889402351,27.449179452)); +#3360=CARTESIAN_POINT('',(19.020116225,-19.899321932,27.499706278)); +#3361=CARTESIAN_POINT('',(19.118507473,-19.926279233,27.590937822)); +#3362=CARTESIAN_POINT('',(19.171277123,-19.943316169,27.631639876)); +#3363=CARTESIAN_POINT('',(19.281759429,-19.983796971,27.701518092)); +#3364=CARTESIAN_POINT('',(19.339468849,-20.007239656,27.730692211)); +#3365=CARTESIAN_POINT('',(19.457413645,-20.059552403,27.776292347)); +#3366=CARTESIAN_POINT('',(19.517645568,-20.088420938,27.79271703)); +#3367=CARTESIAN_POINT('',(19.577879254,-20.119399603,27.802422834)); +#3368=CARTESIAN_POINT('',(18.895742078,-19.965064385,27.43116075)); +#3369=CARTESIAN_POINT('',(18.936772846,-19.970443573,27.483143232)); +#3370=CARTESIAN_POINT('',(18.981990038,-19.979418583,27.531442484)); +#3371=CARTESIAN_POINT('',(19.079014859,-20.004208441,27.618774536)); +#3372=CARTESIAN_POINT('',(19.130819959,-20.020022647,27.657805069)); +#3373=CARTESIAN_POINT('',(19.238974448,-20.0578687,27.725059528)); +#3374=CARTESIAN_POINT('',(19.295321022,-20.079899565,27.753281707)); +#3375=CARTESIAN_POINT('',(19.410333426,-20.129311321,27.797805107)); +#3376=CARTESIAN_POINT('',(19.468996264,-20.156690931,27.81410517)); +#3377=CARTESIAN_POINT('',(19.52766057,-20.186206081,27.824122401)); +#3378=CARTESIAN_POINT('',(18.821777395,-20.129312947,27.509967526)); +#3379=CARTESIAN_POINT('',(18.8625485,-20.133100064,27.557193918)); +#3380=CARTESIAN_POINT('',(18.906877398,-20.140147832,27.601080717)); +#3381=CARTESIAN_POINT('',(19.001103697,-20.160520719,27.680647465)); +#3382=CARTESIAN_POINT('',(19.050999178,-20.173845428,27.7163258)); +#3383=CARTESIAN_POINT('',(19.154614473,-20.206308854,27.778230195)); +#3384=CARTESIAN_POINT('',(19.208332177,-20.225446915,27.804454999)); +#3385=CARTESIAN_POINT('',(19.317714698,-20.26887065,27.84653623)); +#3386=CARTESIAN_POINT('',(19.37337729,-20.293155445,27.862391803)); +#3387=CARTESIAN_POINT('',(19.429040963,-20.319590869,27.872785724)); +#3388=CARTESIAN_POINT('',(18.785546227,-20.211610361,27.552365222)); +#3389=CARTESIAN_POINT('',(18.826114743,-20.214581595,27.597241079)); +#3390=CARTESIAN_POINT('',(18.869957364,-20.220648155,27.638946829)); +#3391=CARTESIAN_POINT('',(18.962753746,-20.238774914,27.714654319)); +#3392=CARTESIAN_POINT('',(19.011705837,-20.250834791,27.748654703)); +#3393=CARTESIAN_POINT('',(19.113113943,-20.280554474,27.807836779)); +#3394=CARTESIAN_POINT('',(19.165568136,-20.298213752,27.833017411)); +#3395=CARTESIAN_POINT('',(19.272258607,-20.338554868,27.873734053)); +#3396=CARTESIAN_POINT('',(19.326492967,-20.361235986,27.889269331)); +#3397=CARTESIAN_POINT('',(19.380728302,-20.386057282,27.899727202)); +#3398=CARTESIAN_POINT('',(18.681888416,-20.45704138,27.687920738)); +#3399=CARTESIAN_POINT('',(18.721712527,-20.457458021,27.725916202)); +#3400=CARTESIAN_POINT('',(18.764054064,-20.460498057,27.761225188)); +#3401=CARTESIAN_POINT('',(18.852635071,-20.471750888,27.825535505)); +#3402=CARTESIAN_POINT('',(18.898873496,-20.479963568,27.854536102)); +#3403=CARTESIAN_POINT('',(18.994007434,-20.501350191,27.905459811)); +#3404=CARTESIAN_POINT('',(19.042901829,-20.514523902,27.927382338)); +#3405=CARTESIAN_POINT('',(19.142037357,-20.545488857,27.963566553)); +#3406=CARTESIAN_POINT('',(19.192277329,-20.563279756,27.977827821)); +#3407=CARTESIAN_POINT('',(19.242517888,-20.583145768,27.988067784)); +#3408=CARTESIAN_POINT('',(18.61876338,-20.619627853,27.789647736)); +#3409=CARTESIAN_POINT('',(18.657901523,-20.618194524,27.823257253)); +#3410=CARTESIAN_POINT('',(18.69917368,-20.619099532,27.854472277)); +#3411=CARTESIAN_POINT('',(18.785010867,-20.625570889,27.911383927)); +#3412=CARTESIAN_POINT('',(18.829575103,-20.631137186,27.937080036)); +#3413=CARTESIAN_POINT('',(18.920942833,-20.646806288,27.982352592)); +#3414=CARTESIAN_POINT('',(18.967745483,-20.656908957,28.001928628)); +#3415=CARTESIAN_POINT('',(19.062484064,-20.681419196,28.034503088)); +#3416=CARTESIAN_POINT('',(19.11041912,-20.69582655,28.047501216)); +#3417=CARTESIAN_POINT('',(19.158354579,-20.712219807,28.057058529)); +#3418=CARTESIAN_POINT('',(18.542959044,-20.865592342,27.96490061)); +#3419=CARTESIAN_POINT('',(18.581150283,-20.860820202,27.992242357)); +#3420=CARTESIAN_POINT('',(18.621057489,-20.858050572,28.017533604)); +#3421=CARTESIAN_POINT('',(18.703508279,-20.85657311,28.063513014)); +#3422=CARTESIAN_POINT('',(18.746051318,-20.857865289,28.084200874)); +#3423=CARTESIAN_POINT('',(18.832924817,-20.864487465,28.120562274)); +#3424=CARTESIAN_POINT('',(18.877254703,-20.869817419,28.136235576)); +#3425=CARTESIAN_POINT('',(18.966817421,-20.884410713,28.162256329)); +#3426=CARTESIAN_POINT('',(19.012049662,-20.893673958,28.172603611)); +#3427=CARTESIAN_POINT('',(19.057282168,-20.904812471,28.180185136)); +#3428=CARTESIAN_POINT('',(18.521102901,-20.947495617,28.026880206)); +#3429=CARTESIAN_POINT('',(18.558995685,-20.941519878,28.052196537)); +#3430=CARTESIAN_POINT('',(18.598492505,-20.937450944,28.075560411)); +#3431=CARTESIAN_POINT('',(18.679947609,-20.933204731,28.11794292)); +#3432=CARTESIAN_POINT('',(18.721905407,-20.933027478,28.136961305)); +#3433=CARTESIAN_POINT('',(18.807488456,-20.936569232,28.170294023)); +#3434=CARTESIAN_POINT('',(18.851113196,-20.940288219,28.184608158)); +#3435=CARTESIAN_POINT('',(18.93920462,-20.951553374,28.208262429)); +#3436=CARTESIAN_POINT('',(18.983670779,-20.959099476,28.217602424)); +#3437=CARTESIAN_POINT('',(19.028137202,-20.968488425,28.224367419)); +#3438=CARTESIAN_POINT('',(18.48691997,-21.108556102,28.156498764)); +#3439=CARTESIAN_POINT('',(18.524330108,-21.099982791,28.177961466)); +#3440=CARTESIAN_POINT('',(18.563174905,-21.093167623,28.197623975)); +#3441=CARTESIAN_POINT('',(18.643061715,-21.083172633,28.233009752)); +#3442=CARTESIAN_POINT('',(18.684103329,-21.079992863,28.248732845)); +#3443=CARTESIAN_POINT('',(18.767672953,-21.077325012,28.275968607)); +#3444=CARTESIAN_POINT('',(18.810200547,-21.077836947,28.287481142)); +#3445=CARTESIAN_POINT('',(18.896005628,-21.082544957,28.306097371)); +#3446=CARTESIAN_POINT('',(18.939282686,-21.086741011,28.313200972)); +#3447=CARTESIAN_POINT('',(18.982559961,-21.092743469,28.318039031)); +#3448=CARTESIAN_POINT('',(18.474469465,-21.188118704,28.224416577)); +#3449=CARTESIAN_POINT('',(18.511693809,-21.178146047,28.244040757)); +#3450=CARTESIAN_POINT('',(18.55029458,-21.169877974,28.2619196)); +#3451=CARTESIAN_POINT('',(18.629602797,-21.156889902,28.293887845)); +#3452=CARTESIAN_POINT('',(18.670309871,-21.152169966,28.307977097)); +#3453=CARTESIAN_POINT('',(18.753148522,-21.146357813,28.332130503)); +#3454=CARTESIAN_POINT('',(18.795279712,-21.145265624,28.342194545)); +#3455=CARTESIAN_POINT('',(18.880260562,-21.146727813,28.358129295)); +#3456=CARTESIAN_POINT('',(18.923109824,-21.149282184,28.363999929)); +#3457=CARTESIAN_POINT('',(18.965959287,-21.153638702,28.367724895)); +#3458=CARTESIAN_POINT('',(18.460566683,-21.345349984,28.36708095)); +#3459=CARTESIAN_POINT('',(18.49758255,-21.332329542,28.383202574)); +#3460=CARTESIAN_POINT('',(18.535910176,-21.320953969,28.397640034)); +#3461=CARTESIAN_POINT('',(18.614571576,-21.301676304,28.422914596)); +#3462=CARTESIAN_POINT('',(18.654905008,-21.293774295,28.43375159)); +#3463=CARTESIAN_POINT('',(18.736927666,-21.28157172,28.451650943)); +#3464=CARTESIAN_POINT('',(18.778616536,-21.277271208,28.458713225)); +#3465=CARTESIAN_POINT('',(18.862677868,-21.272341518,28.468949711)); +#3466=CARTESIAN_POINT('',(18.905049964,-21.271712362,28.472123871)); +#3467=CARTESIAN_POINT('',(18.947422244,-21.272924215,28.473328594)); +#3468=CARTESIAN_POINT('',(18.459259219,-21.423388556,28.442291222)); +#3469=CARTESIAN_POINT('',(18.496254911,-21.408707962,28.456742434)); +#3470=CARTESIAN_POINT('',(18.53455648,-21.395666665,28.469515202)); +#3471=CARTESIAN_POINT('',(18.613156633,-21.373071635,28.491498527)); +#3472=CARTESIAN_POINT('',(18.653454879,-21.363518,28.50070899)); +#3473=CARTESIAN_POINT('',(18.735400935,-21.348051494,28.515419369)); +#3474=CARTESIAN_POINT('',(18.777048391,-21.34213869,28.520919222)); +#3475=CARTESIAN_POINT('',(18.861023731,-21.33404857,28.528119665)); +#3476=CARTESIAN_POINT('',(18.903351254,-21.331871287,28.529820224)); +#3477=CARTESIAN_POINT('',(18.94567896,-21.331579113,28.52960732)); +#3478=CARTESIAN_POINT('',(18.468153997,-21.571794487,28.594185074)); +#3479=CARTESIAN_POINT('',(18.505283866,-21.553637988,28.605577236)); +#3480=CARTESIAN_POINT('',(18.543760707,-21.537158961,28.615251894)); +#3481=CARTESIAN_POINT('',(18.622775268,-21.50782665,28.631006709)); +#3482=CARTESIAN_POINT('',(18.66331263,-21.494973497,28.637086793)); +#3483=CARTESIAN_POINT('',(18.745780555,-21.473104345,28.645551961)); +#3484=CARTESIAN_POINT('',(18.787710744,-21.464088445,28.647937006)); +#3485=CARTESIAN_POINT('',(18.872273701,-21.450042027,28.648972461)); +#3486=CARTESIAN_POINT('',(18.914906086,-21.445011573,28.647622866)); +#3487=CARTESIAN_POINT('',(18.957538664,-21.442015114,28.644416897)); +#3488=CARTESIAN_POINT('',(18.478218761,-21.642875595,28.671465962)); +#3489=CARTESIAN_POINT('',(18.515500675,-21.622891291,28.681452811)); +#3490=CARTESIAN_POINT('',(18.55417599,-21.604627647,28.689677954)); +#3491=CARTESIAN_POINT('',(18.633659635,-21.571849225,28.702464792)); +#3492=CARTESIAN_POINT('',(18.674467585,-21.557334601,28.707026425)); +#3493=CARTESIAN_POINT('',(18.757525973,-21.532298797,28.712407953)); +#3494=CARTESIAN_POINT('',(18.799776014,-21.521777735,28.713227821)); +#3495=CARTESIAN_POINT('',(18.885003689,-21.504906183,28.711110808)); +#3496=CARTESIAN_POINT('',(18.927980916,-21.498555772,28.708173936)); +#3497=CARTESIAN_POINT('',(18.970958349,-21.494343998,28.703382961)); +#3498=CARTESIAN_POINT('',(18.508180005,-21.779217002,28.828660974)); +#3499=CARTESIAN_POINT('',(18.545892841,-21.755391608,28.836044296)); +#3500=CARTESIAN_POINT('',(18.585144808,-21.733416764,28.841532966)); +#3501=CARTESIAN_POINT('',(18.666008873,-21.69356904,28.848619606)); +#3502=CARTESIAN_POINT('',(18.707620517,-21.675696381,28.850217534)); +#3503=CARTESIAN_POINT('',(18.79244179,-21.644379383,28.849492335)); +#3504=CARTESIAN_POINT('',(18.835650944,-21.630935218,28.847169209)); +#3505=CARTESIAN_POINT('',(18.922875867,-21.608720575,28.83864333)); +#3506=CARTESIAN_POINT('',(18.966891148,-21.599950221,28.832440622)); +#3507=CARTESIAN_POINT('',(19.010906674,-21.593596665,28.824354335)); +#3508=CARTESIAN_POINT('',(18.528242957,-21.844892901,28.909134156)); +#3509=CARTESIAN_POINT('',(18.566236446,-21.819039556,28.915312017)); +#3510=CARTESIAN_POINT('',(18.605869402,-21.79512425,28.919505678)); +#3511=CARTESIAN_POINT('',(18.687652031,-21.751627675,28.923842506)); +#3512=CARTESIAN_POINT('',(18.7298012,-21.732046674,28.923985644)); +#3513=CARTESIAN_POINT('',(18.81580484,-21.697594113,28.920217004)); +#3514=CARTESIAN_POINT('',(18.85965878,-21.682722764,28.916305247)); +#3515=CARTESIAN_POINT('',(18.948227845,-21.657974555,28.90450034)); +#3516=CARTESIAN_POINT('',(18.992942422,-21.648097847,28.896607262)); +#3517=CARTESIAN_POINT('',(19.037657276,-21.640813009,28.886798537)); +#3518=CARTESIAN_POINT('',(18.575515297,-21.968372023,29.069673988)); +#3519=CARTESIAN_POINT('',(18.614119384,-21.938356032,29.073648033)); +#3520=CARTESIAN_POINT('',(18.654616751,-21.910486689,29.075424368)); +#3521=CARTESIAN_POINT('',(18.738526112,-21.859639414,29.074541961)); +#3522=CARTESIAN_POINT('',(18.781937457,-21.836661873,29.071883224)); +#3523=CARTESIAN_POINT('',(18.870738993,-21.796092033,29.06218635)); +#3524=CARTESIAN_POINT('',(18.916128498,-21.778500047,29.055148285)); +#3525=CARTESIAN_POINT('',(19.007908044,-21.74907936,29.036842725)); +#3526=CARTESIAN_POINT('',(19.054297374,-21.737250886,29.025575369)); +#3527=CARTESIAN_POINT('',(19.100687063,-21.728431129,29.012313833)); +#3528=CARTESIAN_POINT('',(18.602609591,-22.02619811,29.149670155)); +#3529=CARTESIAN_POINT('',(18.64154199,-21.994050501,29.15264453)); +#3530=CARTESIAN_POINT('',(18.682520586,-21.964170175,29.153297733)); +#3531=CARTESIAN_POINT('',(18.767632838,-21.909624987,29.149945213)); +#3532=CARTESIAN_POINT('',(18.811765751,-21.884960597,29.145939516)); +#3533=CARTESIAN_POINT('',(18.902176043,-21.841410277,29.133358947)); +#3534=CARTESIAN_POINT('',(18.948452632,-21.822524724,29.124784182)); +#3535=CARTESIAN_POINT('',(19.042090818,-21.790963273,29.103259671)); +#3536=CARTESIAN_POINT('',(19.089451597,-21.778287649,29.090310109)); +#3537=CARTESIAN_POINT('',(19.136812789,-21.768861653,29.07532019)); +#3538=CARTESIAN_POINT('',(18.636488109,-22.088739041,29.241458417)); +#3539=CARTESIAN_POINT('',(18.675784815,-22.054088264,29.243367086)); +#3540=CARTESIAN_POINT('',(18.717334574,-22.021857058,29.24279874)); +#3541=CARTESIAN_POINT('',(18.803916246,-21.963028042,29.236721989)); +#3542=CARTESIAN_POINT('',(18.848947276,-21.93643083,29.231213647)); +#3543=CARTESIAN_POINT('',(18.941379989,-21.889526417,29.215392735)); +#3544=CARTESIAN_POINT('',(18.98878073,-21.869219694,29.205080326)); +#3545=CARTESIAN_POINT('',(19.08478285,-21.835397618,29.179905697)); +#3546=CARTESIAN_POINT('',(19.133383251,-21.821882611,29.165043732)); +#3547=CARTESIAN_POINT('',(19.181984147,-21.811930157,29.148090223)); +#3548=CARTESIAN_POINT('',(18.640876927,-22.096675169,29.253209951)); +#3549=CARTESIAN_POINT('',(18.680220023,-22.061702832,29.254983702)); +#3550=CARTESIAN_POINT('',(18.721843244,-22.029169824,29.254260219)); +#3551=CARTESIAN_POINT('',(18.808614672,-21.969791576,29.247836745)); +#3552=CARTESIAN_POINT('',(18.853761979,-21.942946952,29.24213682)); +#3553=CARTESIAN_POINT('',(18.946456877,-21.89561434,29.225902322)); +#3554=CARTESIAN_POINT('',(18.994003507,-21.875126843,29.215367918)); +#3555=CARTESIAN_POINT('',(19.090312556,-21.841019003,29.189726765)); +#3556=CARTESIAN_POINT('',(19.139073977,-21.827399014,29.174620283)); +#3557=CARTESIAN_POINT('',(19.187835904,-21.817382328,29.157415737)); +#3558=CARTESIAN_POINT('',(18.645315518,-22.104542097,29.264963349)); +#3559=CARTESIAN_POINT('',(18.68470467,-22.069247091,29.266603613)); +#3560=CARTESIAN_POINT('',(18.726401616,-22.036411425,29.265726168)); +#3561=CARTESIAN_POINT('',(18.813364307,-21.97648309,29.258957887)); +#3562=CARTESIAN_POINT('',(18.858629133,-21.949391055,29.253067122)); +#3563=CARTESIAN_POINT('',(18.951589393,-21.901631381,29.236420228)); +#3564=CARTESIAN_POINT('',(18.999283844,-21.880964246,29.225664275)); +#3565=CARTESIAN_POINT('',(19.095904047,-21.846574225,29.199557385)); +#3566=CARTESIAN_POINT('',(19.144828777,-21.832851702,29.184206724)); +#3567=CARTESIAN_POINT('',(19.193754025,-21.822773919,29.166751537)); +#3568=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3308,#3309,#3310,#3311,#3312,#3313,#3314,#3315,#3316,#3317),(#3318,#3319,#3320,#3321,#3322,#3323,#3324,#3325,#3326,#3327),(#3328,#3329,#3330,#3331,#3332,#3333,#3334,#3335,#3336,#3337),(#3338,#3339,#3340,#3341,#3342,#3343,#3344,#3345,#3346,#3347),(#3348,#3349,#3350,#3351,#3352,#3353,#3354,#3355,#3356,#3357),(#3358,#3359,#3360,#3361,#3362,#3363,#3364,#3365,#3366,#3367),(#3368,#3369,#3370,#3371,#3372,#3373,#3374,#3375,#3376,#3377),(#3378,#3379,#3380,#3381,#3382,#3383,#3384,#3385,#3386,#3387),(#3388,#3389,#3390,#3391,#3392,#3393,#3394,#3395,#3396,#3397),(#3398,#3399,#3400,#3401,#3402,#3403,#3404,#3405,#3406,#3407),(#3408,#3409,#3410,#3411,#3412,#3413,#3414,#3415,#3416,#3417),(#3418,#3419,#3420,#3421,#3422,#3423,#3424,#3425,#3426,#3427),(#3428,#3429,#3430,#3431,#3432,#3433,#3434,#3435,#3436,#3437),(#3438,#3439,#3440,#3441,#3442,#3443,#3444,#3445,#3446,#3447),(#3448,#3449,#3450,#3451,#3452,#3453,#3454,#3455,#3456,#3457),(#3458,#3459,#3460,#3461,#3462,#3463,#3464,#3465,#3466,#3467),(#3468,#3469,#3470,#3471,#3472,#3473,#3474,#3475,#3476,#3477),(#3478,#3479,#3480,#3481,#3482,#3483,#3484,#3485,#3486,#3487),(#3488,#3489,#3490,#3491,#3492,#3493,#3494,#3495,#3496,#3497),(#3498,#3499,#3500,#3501,#3502,#3503,#3504,#3505,#3506,#3507),(#3508,#3509,#3510,#3511,#3512,#3513,#3514,#3515,#3516,#3517),(#3518,#3519,#3520,#3521,#3522,#3523,#3524,#3525,#3526,#3527),(#3528,#3529,#3530,#3531,#3532,#3533,#3534,#3535,#3536,#3537),(#3538,#3539,#3540,#3541,#3542,#3543,#3544,#3545,#3546,#3547),(#3548,#3549,#3550,#3551,#3552,#3553,#3554,#3555,#3556,#3557),(#3558,#3559,#3560,#3561,#3562,#3563,#3564,#3565,#3566,#3567)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(0.,0.000633434,0.001266868,0.001583585,0.001900302,0.002533736,0.002850452,0.003167169,0.003483886,0.003800603,0.00411732,0.004434037,0.004480535),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#3569=ORIENTED_EDGE('',*,*,#844,.F.); +#3570=ORIENTED_EDGE('',*,*,#1776,.F.); +#3571=CARTESIAN_POINT('',(20.233154644,-19.224694785,26.666750919)); +#3572=DIRECTION('',(0.453596325,0.891207257,0.)); +#3573=DIRECTION('',(-0.891207257,0.453596325,0.)); +#3574=AXIS2_PLACEMENT_3D('',#3571,#3572,#3573); +#3575=CIRCLE('',#3574,1.); +#3576=EDGE_CURVE('',#1617,#678,#3575,.T.); +#3577=ORIENTED_EDGE('',*,*,#3576,.F.); +#3578=ORIENTED_EDGE('',*,*,#1635,.F.); +#3579=EDGE_LOOP('',(#3569,#3570,#3577,#3578)); +#3580=FACE_BOUND('',#3579,.T.); +#3581=ADVANCED_FACE('',(#3580),#3568,.T.); +#3582=CARTESIAN_POINT('',(20.,-15.854009142,26.666754669)); +#3583=CARTESIAN_POINT('',(20.000000246,-15.854009142,26.732203266)); +#3584=CARTESIAN_POINT('',(20.006446332,-15.854009142,26.797650221)); +#3585=CARTESIAN_POINT('',(20.031983351,-15.854009142,26.926033488)); +#3586=CARTESIAN_POINT('',(20.051073895,-15.854009142,26.988966578)); +#3587=CARTESIAN_POINT('',(20.10116704,-15.854009142,27.109902126)); +#3588=CARTESIAN_POINT('',(20.132168401,-15.854009142,27.167901593)); +#3589=CARTESIAN_POINT('',(20.204892374,-15.854009142,27.276740711)); +#3590=CARTESIAN_POINT('',(20.246613188,-15.854009142,27.32757767)); +#3591=CARTESIAN_POINT('',(20.339173249,-15.854009142,27.420137731)); +#3592=CARTESIAN_POINT('',(20.390010208,-15.854009142,27.461858545)); +#3593=CARTESIAN_POINT('',(20.498849326,-15.854009142,27.534582518)); +#3594=CARTESIAN_POINT('',(20.556848794,-15.854009142,27.56558388)); +#3595=CARTESIAN_POINT('',(20.677784342,-15.854009142,27.615677024)); +#3596=CARTESIAN_POINT('',(20.740717431,-15.854009142,27.634767568)); +#3597=CARTESIAN_POINT('',(20.869101924,-15.854009142,27.660304831)); +#3598=CARTESIAN_POINT('',(20.934550153,-15.854009142,27.666750919)); +#3599=CARTESIAN_POINT('',(21.,-15.854009142,27.666750919)); +#3600=CARTESIAN_POINT('',(20.000000176,-16.182965825,26.713577443)); +#3601=CARTESIAN_POINT('',(20.003064899,-16.182965836,26.777075112)); +#3602=CARTESIAN_POINT('',(20.012189884,-16.18326062,26.840269569)); +#3603=CARTESIAN_POINT('',(20.042225552,-16.184428447,26.963779687)); +#3604=CARTESIAN_POINT('',(20.063135793,-16.185301472,27.024092617)); +#3605=CARTESIAN_POINT('',(20.115982656,-16.187592268,27.139664144)); +#3606=CARTESIAN_POINT('',(20.147918118,-16.189009983,27.194920239)); +#3607=CARTESIAN_POINT('',(20.221659409,-16.192335703,27.298386823)); +#3608=CARTESIAN_POINT('',(20.263463628,-16.194243627,27.346595075)); +#3609=CARTESIAN_POINT('',(20.355431589,-16.198476466,27.434229106)); +#3610=CARTESIAN_POINT('',(20.405593329,-16.200801277,27.473652992)); +#3611=CARTESIAN_POINT('',(20.51246506,-16.20577857,27.542298122)); +#3612=CARTESIAN_POINT('',(20.569172728,-16.208430928,27.571517882)); +#3613=CARTESIAN_POINT('',(20.68708976,-16.213961399,27.618702193)); +#3614=CARTESIAN_POINT('',(20.748296565,-16.216839375,27.636665725)); +#3615=CARTESIAN_POINT('',(20.873003591,-16.222710492,27.660690347)); +#3616=CARTESIAN_POINT('',(20.936501107,-16.225703488,27.666750919)); +#3617=CARTESIAN_POINT('',(21.,-16.228696557,27.666750919)); +#3618=CARTESIAN_POINT('',(19.980662072,-16.511914398,26.760399046)); +#3619=CARTESIAN_POINT('',(19.986512245,-16.512335683,26.821729186)); +#3620=CARTESIAN_POINT('',(19.998013553,-16.513293168,26.882509115)); +#3621=CARTESIAN_POINT('',(20.031924967,-16.516246239,27.00091523)); +#3622=CARTESIAN_POINT('',(20.054334621,-16.518241783,27.058539089)); +#3623=CARTESIAN_POINT('',(20.109299784,-16.523200617,27.168680097)); +#3624=CARTESIAN_POINT('',(20.141854232,-16.526163806,27.22119514)); +#3625=CARTESIAN_POINT('',(20.216003092,-16.532954022,27.319340234)); +#3626=CARTESIAN_POINT('',(20.257596079,-16.536780911,27.364968408)); +#3627=CARTESIAN_POINT('',(20.348410714,-16.545164698,27.447794919)); +#3628=CARTESIAN_POINT('',(20.397630619,-16.549721426,27.484991674)); +#3629=CARTESIAN_POINT('',(20.502030099,-16.559405781,27.549696065)); +#3630=CARTESIAN_POINT('',(20.557207672,-16.564533212,27.577202464)); +#3631=CARTESIAN_POINT('',(20.67165221,-16.575180099,27.621594901)); +#3632=CARTESIAN_POINT('',(20.730916982,-16.580699339,27.63848009)); +#3633=CARTESIAN_POINT('',(20.851527534,-16.591937402,27.661058315)); +#3634=CARTESIAN_POINT('',(20.912871004,-16.597655997,27.666750919)); +#3635=CARTESIAN_POINT('',(20.974215648,-16.603374708,27.666750919)); +#3636=CARTESIAN_POINT('',(19.904050555,-17.157186227,26.852245176)); +#3637=CARTESIAN_POINT('',(19.914682843,-17.159055722,26.908976703)); +#3638=CARTESIAN_POINT('',(19.930148237,-17.161846147,26.964764423)); +#3639=CARTESIAN_POINT('',(19.970281019,-17.169183952,27.072797143)); +#3640=CARTESIAN_POINT('',(19.994947981,-17.173731251,27.125040485)); +#3641=CARTESIAN_POINT('',(20.052745777,-17.184444538,27.224429848)); +#3642=CARTESIAN_POINT('',(20.085875751,-17.19061036,27.271574408)); +#3643=CARTESIAN_POINT('',(20.159610668,-17.204373457,27.359364859)); +#3644=CARTESIAN_POINT('',(20.200214518,-17.211970521,27.400009461)); +#3645=CARTESIAN_POINT('',(20.287686857,-17.22836557,27.473592159)); +#3646=CARTESIAN_POINT('',(20.334554052,-17.237163304,27.506529176)); +#3647=CARTESIAN_POINT('',(20.433157232,-17.255692844,27.563718071)); +#3648=CARTESIAN_POINT('',(20.484891761,-17.265424364,27.587969111)); +#3649=CARTESIAN_POINT('',(20.591689607,-17.285526381,27.627065532)); +#3650=CARTESIAN_POINT('',(20.646751349,-17.295896569,27.641910341)); +#3651=CARTESIAN_POINT('',(20.758565079,-17.316961502,27.66175318)); +#3652=CARTESIAN_POINT('',(20.815315419,-17.327655925,27.666750919)); +#3653=CARTESIAN_POINT('',(20.872066595,-17.338350512,27.666750919)); +#3654=CARTESIAN_POINT('',(19.846779037,-17.473493527,26.897267432)); +#3655=CARTESIAN_POINT('',(19.85940839,-17.476389318,26.951568496)); +#3656=CARTESIAN_POINT('',(19.876462042,-17.480349457,27.004779038)); +#3657=CARTESIAN_POINT('',(19.918941451,-17.490285906,27.107543159)); +#3658=CARTESIAN_POINT('',(19.944366814,-17.49626212,27.157095346)); +#3659=CARTESIAN_POINT('',(20.002879833,-17.510061343,27.251163997)); +#3660=CARTESIAN_POINT('',(20.035966731,-17.517884168,27.29567925)); +#3661=CARTESIAN_POINT('',(20.108880695,-17.535155454,27.378436683)); +#3662=CARTESIAN_POINT('',(20.148706818,-17.544603687,27.416677798)); +#3663=CARTESIAN_POINT('',(20.233990304,-17.56485905,27.485824155)); +#3664=CARTESIAN_POINT('',(20.279446567,-17.575665911,27.516728508)); +#3665=CARTESIAN_POINT('',(20.37472536,-17.598333693,27.570342514)); +#3666=CARTESIAN_POINT('',(20.424546662,-17.610194314,27.593051478)); +#3667=CARTESIAN_POINT('',(20.527169585,-17.634635234,27.629643623)); +#3668=CARTESIAN_POINT('',(20.579969884,-17.647215211,27.643526334)); +#3669=CARTESIAN_POINT('',(20.687082281,-17.672740289,27.662080101)); +#3670=CARTESIAN_POINT('',(20.741393,-17.685685055,27.666750919)); +#3671=CARTESIAN_POINT('',(20.795704418,-17.698629991,27.666750919)); +#3672=CARTESIAN_POINT('',(19.696499782,-18.081326358,26.98378456)); +#3673=CARTESIAN_POINT('',(19.712216854,-18.086634501,27.033153546)); +#3674=CARTESIAN_POINT('',(19.731577222,-18.093213193,27.081221091)); +#3675=CARTESIAN_POINT('',(19.777113703,-18.108750027,27.173593889)); +#3676=CARTESIAN_POINT('',(19.803289497,-18.117708058,27.217898174)); +#3677=CARTESIAN_POINT('',(19.861820678,-18.1377834,27.301672596)); +#3678=CARTESIAN_POINT('',(19.894175492,-18.148900511,27.341141922)); +#3679=CARTESIAN_POINT('',(19.964280069,-18.173021202,27.414292766)); +#3680=CARTESIAN_POINT('',(20.002029148,-18.186024541,27.447973576)); +#3681=CARTESIAN_POINT('',(20.082007864,-18.213598847,27.508733789)); +#3682=CARTESIAN_POINT('',(20.124236722,-18.228169538,27.535812604)); +#3683=CARTESIAN_POINT('',(20.212152882,-18.258521465,27.582714811)); +#3684=CARTESIAN_POINT('',(20.257839329,-18.274302397,27.60253775)); +#3685=CARTESIAN_POINT('',(20.351565418,-18.306688193,27.634449469)); +#3686=CARTESIAN_POINT('',(20.39960415,-18.323292732,27.646537939)); +#3687=CARTESIAN_POINT('',(20.496873006,-18.356919035,27.662688743)); +#3688=CARTESIAN_POINT('',(20.546102185,-18.373940462,27.666750919)); +#3689=CARTESIAN_POINT('',(20.595331842,-18.39096206,27.666750919)); +#3690=CARTESIAN_POINT('',(19.60349576,-18.372836861,27.025277294)); +#3691=CARTESIAN_POINT('',(19.620303886,-18.379530557,27.072145223)); +#3692=CARTESIAN_POINT('',(19.640383155,-18.387557703,27.11764739)); +#3693=CARTESIAN_POINT('',(19.686630933,-18.406095689,27.204898147)); +#3694=CARTESIAN_POINT('',(19.712799166,-18.416606416,27.24664593)); +#3695=CARTESIAN_POINT('',(19.770633989,-18.439871648,27.325447188)); +#3696=CARTESIAN_POINT('',(19.80230009,-18.452625953,27.362499999)); +#3697=CARTESIAN_POINT('',(19.870416664,-18.48008775,27.431077394)); +#3698=CARTESIAN_POINT('',(19.906866561,-18.494795006,27.4626014)); +#3699=CARTESIAN_POINT('',(19.983729464,-18.525827933,27.519411791)); +#3700=CARTESIAN_POINT('',(20.024141821,-18.542153337,27.544697696)); +#3701=CARTESIAN_POINT('',(20.108019523,-18.576051191,27.588462911)); +#3702=CARTESIAN_POINT('',(20.151484161,-18.593623349,27.606941852)); +#3703=CARTESIAN_POINT('',(20.240487866,-18.629615141,27.636677333)); +#3704=CARTESIAN_POINT('',(20.286026183,-18.648034467,27.647933622)); +#3705=CARTESIAN_POINT('',(20.378152186,-18.685301864,27.662970478)); +#3706=CARTESIAN_POINT('',(20.424739095,-18.704149616,27.666750919)); +#3707=CARTESIAN_POINT('',(20.471326396,-18.722997529,27.666750919)); +#3708=CARTESIAN_POINT('',(19.471904459,-18.702783487,27.072240902)); +#3709=CARTESIAN_POINT('',(19.489471645,-18.711222972,27.116167138)); +#3710=CARTESIAN_POINT('',(19.509897028,-18.72103682,27.158685798)); +#3711=CARTESIAN_POINT('',(19.556041471,-18.743210053,27.240028076)); +#3712=CARTESIAN_POINT('',(19.581760301,-18.755569326,27.278851039)); +#3713=CARTESIAN_POINT('',(19.637957941,-18.782576828,27.351995694)); +#3714=CARTESIAN_POINT('',(19.668436348,-18.797224862,27.38631686)); +#3715=CARTESIAN_POINT('',(19.733520974,-18.828505929,27.449745983)); +#3716=CARTESIAN_POINT('',(19.768126725,-18.845138737,27.478853484)); +#3717=CARTESIAN_POINT('',(19.840748274,-18.880044214,27.531251472)); +#3718=CARTESIAN_POINT('',(19.87876355,-18.898316632,27.554541583)); +#3719=CARTESIAN_POINT('',(19.957415666,-18.93612217,27.594821642)); +#3720=CARTESIAN_POINT('',(19.998051941,-18.955655018,27.6118113)); +#3721=CARTESIAN_POINT('',(20.081103213,-18.995576103,27.63913798)); +#3722=CARTESIAN_POINT('',(20.123517613,-19.015964053,27.649474804)); +#3723=CARTESIAN_POINT('',(20.209245405,-19.05717228,27.663281324)); +#3724=CARTESIAN_POINT('',(20.252558182,-19.077992262,27.666750919)); +#3725=CARTESIAN_POINT('',(20.29587127,-19.098812394,27.666750919)); +#3726=CARTESIAN_POINT('',(19.448714814,-18.758446131,27.080163755)); +#3727=CARTESIAN_POINT('',(19.46639218,-18.767186795,27.123589567)); +#3728=CARTESIAN_POINT('',(19.486858389,-18.777307591,27.165601911)); +#3729=CARTESIAN_POINT('',(19.532951271,-18.800103049,27.245943254)); +#3730=CARTESIAN_POINT('',(19.558577722,-18.8127776,27.284271623)); +#3731=CARTESIAN_POINT('',(19.614467262,-18.840421384,27.356460958)); +#3732=CARTESIAN_POINT('',(19.644729962,-18.855390424,27.390321421)); +#3733=CARTESIAN_POINT('',(19.709273701,-18.887317228,27.452883076)); +#3734=CARTESIAN_POINT('',(19.743554292,-18.904274769,27.481583832)); +#3735=CARTESIAN_POINT('',(19.815433436,-18.939831976,27.533239621)); +#3736=CARTESIAN_POINT('',(19.853031488,-18.958431393,27.556194293)); +#3737=CARTESIAN_POINT('',(19.930777405,-18.996892194,27.595888852)); +#3738=CARTESIAN_POINT('',(19.970924727,-19.016753309,27.612628462)); +#3739=CARTESIAN_POINT('',(20.052948947,-19.057331556,27.63955081)); +#3740=CARTESIAN_POINT('',(20.094825273,-19.078048406,27.649733361)); +#3741=CARTESIAN_POINT('',(20.179451939,-19.119914682,27.663333463)); +#3742=CARTESIAN_POINT('',(20.222201688,-19.141063817,27.666750919)); +#3743=CARTESIAN_POINT('',(20.264951735,-19.162213099,27.666750919)); +#3744=CARTESIAN_POINT('',(19.424861964,-18.813299358,27.087971398)); +#3745=CARTESIAN_POINT('',(19.44263018,-18.822342876,27.13090027)); +#3746=CARTESIAN_POINT('',(19.463119194,-18.832771171,27.17241093)); +#3747=CARTESIAN_POINT('',(19.509127351,-18.856187915,27.251762098)); +#3748=CARTESIAN_POINT('',(19.53464628,-18.869176254,27.289602)); +#3749=CARTESIAN_POINT('',(19.590200361,-18.897451539,27.360848964)); +#3750=CARTESIAN_POINT('',(19.620235137,-18.912738293,27.394255544)); +#3751=CARTESIAN_POINT('',(19.684216342,-18.945302711,27.455963312)); +#3752=CARTESIAN_POINT('',(19.718162339,-18.962580155,27.484264083)); +#3753=CARTESIAN_POINT('',(19.789282672,-18.998778174,27.535190453)); +#3754=CARTESIAN_POINT('',(19.826456527,-19.017698504,27.557815709)); +#3755=CARTESIAN_POINT('',(19.903284283,-19.05680144,27.596935518)); +#3756=CARTESIAN_POINT('',(19.942937662,-19.07698378,27.613429805)); +#3757=CARTESIAN_POINT('',(20.023926245,-19.118204464,27.639955558)); +#3758=CARTESIAN_POINT('',(20.0652609,-19.13924253,27.649986843)); +#3759=CARTESIAN_POINT('',(20.148779962,-19.181751162,27.663384569)); +#3760=CARTESIAN_POINT('',(20.190963802,-19.20322144,27.666750919)); +#3761=CARTESIAN_POINT('',(20.233147928,-19.224691864,27.666750919)); +#3762=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3582,#3583,#3584,#3585,#3586,#3587,#3588,#3589,#3590,#3591,#3592,#3593,#3594,#3595,#3596,#3597,#3598,#3599),(#3600,#3601,#3602,#3603,#3604,#3605,#3606,#3607,#3608,#3609,#3610,#3611,#3612,#3613,#3614,#3615,#3616,#3617),(#3618,#3619,#3620,#3621,#3622,#3623,#3624,#3625,#3626,#3627,#3628,#3629,#3630,#3631,#3632,#3633,#3634,#3635),(#3636,#3637,#3638,#3639,#3640,#3641,#3642,#3643,#3644,#3645,#3646,#3647,#3648,#3649,#3650,#3651,#3652,#3653),(#3654,#3655,#3656,#3657,#3658,#3659,#3660,#3661,#3662,#3663,#3664,#3665,#3666,#3667,#3668,#3669,#3670,#3671),(#3672,#3673,#3674,#3675,#3676,#3677,#3678,#3679,#3680,#3681,#3682,#3683,#3684,#3685,#3686,#3687,#3688,#3689),(#3690,#3691,#3692,#3693,#3694,#3695,#3696,#3697,#3698,#3699,#3700,#3701,#3702,#3703,#3704,#3705,#3706,#3707),(#3708,#3709,#3710,#3711,#3712,#3713,#3714,#3715,#3716,#3717,#3718,#3719,#3720,#3721,#3722,#3723,#3724,#3725),(#3726,#3727,#3728,#3729,#3730,#3731,#3732,#3733,#3734,#3735,#3736,#3737,#3738,#3739,#3740,#3741,#3742,#3743),(#3744,#3745,#3746,#3747,#3748,#3749,#3750,#3751,#3752,#3753,#3754,#3755,#3756,#3757,#3758,#3759,#3760,#3761)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,4),(4,2,2,2,2,2,2,2,4),(4.71238898,4.908738521,5.105088062,5.301437603,5.341946224),(0.000002387,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1.),.UNSPECIFIED.); +#3763=ORIENTED_EDGE('',*,*,#3576,.T.); +#3764=ORIENTED_EDGE('',*,*,#684,.F.); +#3765=CARTESIAN_POINT('',(21.,-15.854009142,26.666750919)); +#3766=DIRECTION('',(0.,1.,0.)); +#3767=DIRECTION('',(0.,-0.,1.)); +#3768=AXIS2_PLACEMENT_3D('',#3765,#3766,#3767); +#3769=CIRCLE('',#3768,1.); +#3770=EDGE_CURVE('',#35,#670,#3769,.T.); +#3771=ORIENTED_EDGE('',*,*,#3770,.F.); +#3772=ORIENTED_EDGE('',*,*,#1642,.F.); +#3773=EDGE_LOOP('',(#3763,#3764,#3771,#3772)); +#3774=FACE_BOUND('',#3773,.T.); +#3775=ADVANCED_FACE('',(#3774),#3762,.T.); +#3776=CARTESIAN_POINT('',(21.,0.,26.666750919)); +#3777=DIRECTION('',(0.,1.,0.)); +#3778=DIRECTION('',(0.,-0.,1.)); +#3779=AXIS2_PLACEMENT_3D('',#3776,#3777,#3778); +#3780=CYLINDRICAL_SURFACE('',#3779,1.); +#3781=ORIENTED_EDGE('',*,*,#3770,.T.); +#3782=ORIENTED_EDGE('',*,*,#675,.F.); +#3783=CARTESIAN_POINT('',(21.,5.485205765,26.666750919)); +#3784=DIRECTION('',(0.,1.,0.)); +#3785=DIRECTION('',(0.,-0.,1.)); +#3786=AXIS2_PLACEMENT_3D('',#3783,#3784,#3785); +#3787=CIRCLE('',#3786,1.); +#3788=EDGE_CURVE('',#43,#662,#3787,.T.); +#3789=ORIENTED_EDGE('',*,*,#3788,.F.); +#3790=ORIENTED_EDGE('',*,*,#48,.F.); +#3791=EDGE_LOOP('',(#3781,#3782,#3789,#3790)); +#3792=FACE_BOUND('',#3791,.T.); +#3793=ADVANCED_FACE('',(#3792),#3780,.T.); +#3794=CARTESIAN_POINT('',(21.,28.534785562,8.846153846)); +#3795=CARTESIAN_POINT('',(20.869100306,28.534785562,8.846153846)); +#3796=CARTESIAN_POINT('',(20.738252116,28.520914594,8.824130726)); +#3797=CARTESIAN_POINT('',(20.49638102,28.467521443,8.739357713)); +#3798=CARTESIAN_POINT('',(20.38545328,28.428020268,8.676641174)); +#3799=CARTESIAN_POINT('',(20.200333158,28.329362588,8.520001071)); +#3800=CARTESIAN_POINT('',(20.126213612,28.270244902,8.426139137)); +#3801=CARTESIAN_POINT('',(20.026027323,28.141342432,8.221478979)); +#3802=CARTESIAN_POINT('',(20.,28.071608366,8.110761279)); +#3803=CARTESIAN_POINT('',(20.,28.001846852,8.)); +#3804=CARTESIAN_POINT('',(21.,29.057908801,8.516671654)); +#3805=CARTESIAN_POINT('',(20.875140813,29.052852062,8.519856574)); +#3806=CARTESIAN_POINT('',(20.750321281,29.035766894,8.502731664)); +#3807=CARTESIAN_POINT('',(20.517796058,28.979926292,8.430143925)); +#3808=CARTESIAN_POINT('',(20.410164355,28.941188965,8.374703523)); +#3809=CARTESIAN_POINT('',(20.226877483,28.847381921,8.233033264)); +#3810=CARTESIAN_POINT('',(20.151281035,28.792341975,8.146847814)); +#3811=CARTESIAN_POINT('',(20.042568734,28.673481419,7.955490509)); +#3812=CARTESIAN_POINT('',(20.009488406,28.609698247,7.850379136)); +#3813=CARTESIAN_POINT('',(20.,28.54589502,7.74300389)); +#3814=CARTESIAN_POINT('',(20.956795278,29.586215266,8.210931006)); +#3815=CARTESIAN_POINT('',(20.838192196,29.577498185,8.21592274)); +#3816=CARTESIAN_POINT('',(20.719620298,29.558321245,8.202238368)); +#3817=CARTESIAN_POINT('',(20.497257823,29.501455542,8.139193917)); +#3818=CARTESIAN_POINT('',(20.393525767,29.463781871,8.089850202)); +#3819=CARTESIAN_POINT('',(20.213850893,29.374637817,7.961613616)); +#3820=CARTESIAN_POINT('',(20.137955528,29.323190877,7.882754212)); +#3821=CARTESIAN_POINT('',(20.023509229,29.212926405,7.705310781)); +#3822=CARTESIAN_POINT('',(19.984988813,29.154137774,7.606773208)); +#3823=CARTESIAN_POINT('',(19.967596458,29.095333744,7.504526185)); +#3824=CARTESIAN_POINT('',(20.811256778,30.65517547,7.642507021)); +#3825=CARTESIAN_POINT('',(20.705002059,30.640944557,7.649717978)); +#3826=CARTESIAN_POINT('',(20.598765688,30.618965465,7.641351388)); +#3827=CARTESIAN_POINT('',(20.397086594,30.56176695,7.594285486)); +#3828=CARTESIAN_POINT('',(20.30167876,30.526557561,7.555594065)); +#3829=CARTESIAN_POINT('',(20.131402732,30.446492904,7.451776851)); +#3830=CARTESIAN_POINT('',(20.056564175,30.401651467,7.386668707)); +#3831=CARTESIAN_POINT('',(19.935107276,30.306882813,7.236610556)); +#3832=CARTESIAN_POINT('',(19.888510382,30.25697186,7.151686237)); +#3833=CARTESIAN_POINT('',(19.858442583,30.207052357,7.061155477)); +#3834=CARTESIAN_POINT('',(20.708584724,31.195799437,7.379868084)); +#3835=CARTESIAN_POINT('',(20.608440616,31.17972687,7.387473694)); +#3836=CARTESIAN_POINT('',(20.508310491,31.157048345,7.38096643)); +#3837=CARTESIAN_POINT('',(20.317184321,31.1005569,7.340308221)); +#3838=CARTESIAN_POINT('',(20.226214986,31.066751924,7.306162875)); +#3839=CARTESIAN_POINT('',(20.061744928,30.991102597,7.213326395)); +#3840=CARTESIAN_POINT('',(19.988267259,30.949268814,7.154648107)); +#3841=CARTESIAN_POINT('',(19.865531892,30.861384423,7.018084506)); +#3842=CARTESIAN_POINT('',(19.816291516,30.815346057,6.940218135)); +#3843=CARTESIAN_POINT('',(19.781438541,30.769301281,6.856297106)); +#3844=CARTESIAN_POINT('',(20.521266858,32.016886406,7.016591418)); +#3845=CARTESIAN_POINT('',(20.430092476,31.999011065,7.024252793)); +#3846=CARTESIAN_POINT('',(20.338927261,31.975987185,7.019860262)); +#3847=CARTESIAN_POINT('',(20.163641957,31.921421112,6.987303281)); +#3848=CARTESIAN_POINT('',(20.079539498,31.88988442,6.959142083)); +#3849=CARTESIAN_POINT('',(19.924899604,31.820735819,6.881219769)); +#3850=CARTESIAN_POINT('',(19.854377742,31.783130863,6.831466455)); +#3851=CARTESIAN_POINT('',(19.732372151,31.704757298,6.714203979)); +#3852=CARTESIAN_POINT('',(19.68090074,31.663996561,6.646706573)); +#3853=CARTESIAN_POINT('',(19.640950142,31.62323173,6.572941307)); +#3854=CARTESIAN_POINT('',(20.453214441,32.292270914,6.900625772)); +#3855=CARTESIAN_POINT('',(20.364999189,32.27395689,6.908212975)); +#3856=CARTESIAN_POINT('',(20.276791793,32.250937282,6.904409561)); +#3857=CARTESIAN_POINT('',(20.106792516,32.197159913,6.87429583)); +#3858=CARTESIAN_POINT('',(20.025015779,32.16640695,6.847988182)); +#3859=CARTESIAN_POINT('',(19.873842891,32.099404644,6.77477634)); +#3860=CARTESIAN_POINT('',(19.804460218,32.063161269,6.727878644)); +#3861=CARTESIAN_POINT('',(19.683140857,31.987819158,6.616897229)); +#3862=CARTESIAN_POINT('',(19.631215003,31.948727127,6.552823368)); +#3863=CARTESIAN_POINT('',(19.58991083,31.909631618,6.482488102)); +#3864=CARTESIAN_POINT('',(20.307249443,32.846553544,6.678799854)); +#3865=CARTESIAN_POINT('',(20.224889441,32.827638586,6.686111824)); +#3866=CARTESIAN_POINT('',(20.142535107,32.804827137,6.683311608)); +#3867=CARTESIAN_POINT('',(19.983100175,32.752871952,6.657663998)); +#3868=CARTESIAN_POINT('',(19.906030552,32.723731801,6.634818355)); +#3869=CARTESIAN_POINT('',(19.762113368,32.660989411,6.570539247)); +#3870=CARTESIAN_POINT('',(19.695275725,32.627391491,6.529110182)); +#3871=CARTESIAN_POINT('',(19.576117996,32.557888536,6.430314874)); +#3872=CARTESIAN_POINT('',(19.523806142,32.521988278,6.372955403)); +#3873=CARTESIAN_POINT('',(19.480437082,32.486085553,6.309463886)); +#3874=CARTESIAN_POINT('',(20.229158375,33.126016066,6.5727525)); +#3875=CARTESIAN_POINT('',(20.149700213,33.106939189,6.579862676)); +#3876=CARTESIAN_POINT('',(20.070246841,33.08433252,6.577476913)); +#3877=CARTESIAN_POINT('',(19.916100881,33.03341348,6.553855164)); +#3878=CARTESIAN_POINT('',(19.841417585,33.005104182,6.532620594)); +#3879=CARTESIAN_POINT('',(19.701297444,32.944479557,6.472571031)); +#3880=CARTESIAN_POINT('',(19.635869051,32.912167885,6.433759644)); +#3881=CARTESIAN_POINT('',(19.518191386,32.845477679,6.340880324)); +#3882=CARTESIAN_POINT('',(19.465949222,32.811103162,6.286817971)); +#3883=CARTESIAN_POINT('',(19.421868781,32.776726576,6.22674695)); +#3884=CARTESIAN_POINT('',(19.983849792,33.963031429,6.27201984)); +#3885=CARTESIAN_POINT('',(19.912939043,33.94382396,6.278408898)); +#3886=CARTESIAN_POINT('',(19.842030926,33.922076185,6.277061324)); +#3887=CARTESIAN_POINT('',(19.703601,33.874546108,6.258952639)); +#3888=CARTESIAN_POINT('',(19.63608434,33.848765595,6.242192168)); +#3889=CARTESIAN_POINT('',(19.50767197,33.794405874,6.194045453)); +#3890=CARTESIAN_POINT('',(19.446781066,33.765828687,6.162660936)); +#3891=CARTESIAN_POINT('',(19.334547698,33.707240777,6.086747219)); +#3892=CARTESIAN_POINT('',(19.283209482,33.677232219,6.04222076)); +#3893=CARTESIAN_POINT('',(19.237887344,33.647222554,5.992175475)); +#3894=CARTESIAN_POINT('',(19.805364252,34.520747681,6.093983237)); +#3895=CARTESIAN_POINT('',(19.739957806,34.501919328,6.099741604)); +#3896=CARTESIAN_POINT('',(19.674553176,34.481066321,6.098821072)); +#3897=CARTESIAN_POINT('',(19.5464277,34.436169108,6.083658628)); +#3898=CARTESIAN_POINT('',(19.483710413,34.412126154,6.069417129)); +#3899=CARTESIAN_POINT('',(19.363538778,34.361837985,6.02819116)); +#3900=CARTESIAN_POINT('',(19.306087775,34.335594166,6.001207815)); +#3901=CARTESIAN_POINT('',(19.198815495,34.281981978,5.935596044)); +#3902=CARTESIAN_POINT('',(19.148997216,34.254615096,5.896969411)); +#3903=CARTESIAN_POINT('',(19.104023183,34.227247455,5.85330693)); +#3904=CARTESIAN_POINT('',(19.237621494,36.196119866,5.62200274)); +#3905=CARTESIAN_POINT('',(19.188284303,36.179392295,5.625806973)); +#3906=CARTESIAN_POINT('',(19.13894729,36.161867901,5.625762453)); +#3907=CARTESIAN_POINT('',(19.041300731,36.125609365,5.617969928)); +#3908=CARTESIAN_POINT('',(18.992991549,36.106875384,5.610221905)); +#3909=CARTESIAN_POINT('',(18.898417716,36.068594357,5.587151802)); +#3910=CARTESIAN_POINT('',(18.852153456,36.049047453,5.571829704)); +#3911=CARTESIAN_POINT('',(18.762664501,36.009545143,5.533876901)); +#3912=CARTESIAN_POINT('',(18.719440238,35.989589867,5.511246186)); +#3913=CARTESIAN_POINT('',(18.678216116,35.969634528,5.485162143)); +#3914=CARTESIAN_POINT('',(18.816548763,37.316053517,5.389695945)); +#3915=CARTESIAN_POINT('',(18.777336194,37.301994562,5.392136994)); +#3916=CARTESIAN_POINT('',(18.738123726,37.287534718,5.392159652)); +#3917=CARTESIAN_POINT('',(18.66021585,37.258005185,5.387367767)); +#3918=CARTESIAN_POINT('',(18.621520644,37.242935574,5.382553234)); +#3919=CARTESIAN_POINT('',(18.545158488,37.212385747,5.368146198)); +#3920=CARTESIAN_POINT('',(18.507491737,37.19690561,5.358553728)); +#3921=CARTESIAN_POINT('',(18.433685618,37.165738782,5.334709057)); +#3922=CARTESIAN_POINT('',(18.397546444,37.150052172,5.32045691)); +#3923=CARTESIAN_POINT('',(18.362411557,37.134365521,5.303962851)); +#3924=CARTESIAN_POINT('',(18.153062445,39.009417849,5.15631272)); +#3925=CARTESIAN_POINT('',(18.128698366,39.000190483,5.157332752)); +#3926=CARTESIAN_POINT('',(18.104334294,38.990862624,5.157378305)); +#3927=CARTESIAN_POINT('',(18.055734634,38.972055647,5.15552016)); +#3928=CARTESIAN_POINT('',(18.03149906,38.962576535,5.153616464)); +#3929=CARTESIAN_POINT('',(17.98328452,38.943517226,5.147868149)); +#3930=CARTESIAN_POINT('',(17.959305567,38.933937036,5.144023532)); +#3931=CARTESIAN_POINT('',(17.911731643,38.914726039,5.134410322)); +#3932=CARTESIAN_POINT('',(17.888136684,38.905095237,5.12864173)); +#3933=CARTESIAN_POINT('',(17.864796834,38.895464433,5.121923933)); +#3934=CARTESIAN_POINT('',(17.926417452,39.57608907,5.097837849)); +#3935=CARTESIAN_POINT('',(17.906945861,39.568616443,5.098480392)); +#3936=CARTESIAN_POINT('',(17.887474273,39.561093493,5.098512531)); +#3937=CARTESIAN_POINT('',(17.848595437,39.545971845,5.097355903)); +#3938=CARTESIAN_POINT('',(17.829188194,39.538373149,5.096167135)); +#3939=CARTESIAN_POINT('',(17.790502206,39.523125134,5.092572356)); +#3940=CARTESIAN_POINT('',(17.771223466,39.515475816,5.090166346)); +#3941=CARTESIAN_POINT('',(17.732858261,39.500151831,5.084144508)); +#3942=CARTESIAN_POINT('',(17.713771803,39.492477166,5.08052868)); +#3943=CARTESIAN_POINT('',(17.694813089,39.4848025,5.076313522)); +#3944=CARTESIAN_POINT('',(17.581295792,40.430462315,5.039172665)); +#3945=CARTESIAN_POINT('',(17.569142638,40.425736622,5.039432434)); +#3946=CARTESIAN_POINT('',(17.556989485,40.420998335,5.039447529)); +#3947=CARTESIAN_POINT('',(17.532699246,40.411502851,5.038988352)); +#3948=CARTESIAN_POINT('',(17.520562161,40.406745655,5.03851408)); +#3949=CARTESIAN_POINT('',(17.496320112,40.397218649,5.037076693)); +#3950=CARTESIAN_POINT('',(17.48421515,40.39244884,5.036113577)); +#3951=CARTESIAN_POINT('',(17.460053381,40.382902912,5.033699564)); +#3952=CARTESIAN_POINT('',(17.447996575,40.378126794,5.032248667)); +#3953=CARTESIAN_POINT('',(17.435971844,40.373350675,5.030554679)); +#3954=CARTESIAN_POINT('',(17.465323372,40.716151051,5.024467961)); +#3955=CARTESIAN_POINT('',(17.455607748,40.712360828,5.024630477)); +#3956=CARTESIAN_POINT('',(17.445892124,40.708564316,5.024640136)); +#3957=CARTESIAN_POINT('',(17.426468899,40.700961847,5.024353732)); +#3958=CARTESIAN_POINT('',(17.416761299,40.697155892,5.024057669)); +#3959=CARTESIAN_POINT('',(17.397362141,40.689537682,5.02316005)); +#3960=CARTESIAN_POINT('',(17.387670584,40.685725427,5.022558493)); +#3961=CARTESIAN_POINT('',(17.368311517,40.678097767,5.021050351)); +#3962=CARTESIAN_POINT('',(17.358644009,40.674282362,5.020143765)); +#3963=CARTESIAN_POINT('',(17.348992519,40.670466956,5.019085013)); +#3964=CARTESIAN_POINT('',(17.232976357,41.287123513,5.0048923)); +#3965=CARTESIAN_POINT('',(17.228122687,41.285219743,5.004925002)); +#3966=CARTESIAN_POINT('',(17.223269017,41.283315973,5.004927117)); +#3967=CARTESIAN_POINT('',(17.213561675,41.279508437,5.004870176)); +#3968=CARTESIAN_POINT('',(17.208708002,41.27760467,5.00481112)); +#3969=CARTESIAN_POINT('',(17.199000655,41.273797139,5.004631802)); +#3970=CARTESIAN_POINT('',(17.194146979,41.271893375,5.004511541)); +#3971=CARTESIAN_POINT('',(17.184439627,41.268085849,5.004209747)); +#3972=CARTESIAN_POINT('',(17.179585951,41.266182087,5.004028214)); +#3973=CARTESIAN_POINT('',(17.174732277,41.264278325,5.003815996)); +#3974=CARTESIAN_POINT('',(17.116508227,41.572638698,5.)); +#3975=CARTESIAN_POINT('',(17.116508227,41.572638698,5.)); +#3976=CARTESIAN_POINT('',(17.109226495,41.569782568,5.)); +#3977=CARTESIAN_POINT('',(17.109226495,41.569782568,5.)); +#3978=CARTESIAN_POINT('',(17.101944762,41.566926438,5.)); +#3979=CARTESIAN_POINT('',(17.101944762,41.566926438,5.)); +#3980=CARTESIAN_POINT('',(17.094663029,41.564070309,5.)); +#3981=CARTESIAN_POINT('',(17.094663029,41.564070309,5.)); +#3982=CARTESIAN_POINT('',(17.087381297,41.561214179,5.)); +#3983=CARTESIAN_POINT('',(17.087381297,41.561214179,5.)); +#3984=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3985=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3986=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3987=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3988=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3989=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3990=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3991=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3992=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3993=CARTESIAN_POINT('',(17.,41.858253313,5.)); +#3994=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3794,#3795,#3796,#3797,#3798,#3799,#3800,#3801,#3802,#3803),(#3804,#3805,#3806,#3807,#3808,#3809,#3810,#3811,#3812,#3813),(#3814,#3815,#3816,#3817,#3818,#3819,#3820,#3821,#3822,#3823),(#3824,#3825,#3826,#3827,#3828,#3829,#3830,#3831,#3832,#3833),(#3834,#3835,#3836,#3837,#3838,#3839,#3840,#3841,#3842,#3843),(#3844,#3845,#3846,#3847,#3848,#3849,#3850,#3851,#3852,#3853),(#3854,#3855,#3856,#3857,#3858,#3859,#3860,#3861,#3862,#3863),(#3864,#3865,#3866,#3867,#3868,#3869,#3870,#3871,#3872,#3873),(#3874,#3875,#3876,#3877,#3878,#3879,#3880,#3881,#3882,#3883),(#3884,#3885,#3886,#3887,#3888,#3889,#3890,#3891,#3892,#3893),(#3894,#3895,#3896,#3897,#3898,#3899,#3900,#3901,#3902,#3903),(#3904,#3905,#3906,#3907,#3908,#3909,#3910,#3911,#3912,#3913),(#3914,#3915,#3916,#3917,#3918,#3919,#3920,#3921,#3922,#3923),(#3924,#3925,#3926,#3927,#3928,#3929,#3930,#3931,#3932,#3933),(#3934,#3935,#3936,#3937,#3938,#3939,#3940,#3941,#3942,#3943),(#3944,#3945,#3946,#3947,#3948,#3949,#3950,#3951,#3952,#3953),(#3954,#3955,#3956,#3957,#3958,#3959,#3960,#3961,#3962,#3963),(#3964,#3965,#3966,#3967,#3968,#3969,#3970,#3971,#3972,#3973),(#3974,#3975,#3976,#3977,#3978,#3979,#3980,#3981,#3982,#3983),(#3984,#3985,#3986,#3987,#3988,#3989,#3990,#3991,#3992,#3993)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.014249141,0.015199084),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#3995=ORIENTED_EDGE('',*,*,#1544,.F.); +#3996=ORIENTED_EDGE('',*,*,#1597,.F.); +#3997=CARTESIAN_POINT('',(21.,28.001846852,8.)); +#3998=DIRECTION('',(0.,-0.846153846,0.53293871)); +#3999=DIRECTION('',(-0.,-0.53293871,-0.846153846)); +#4000=AXIS2_PLACEMENT_3D('',#3997,#3998,#3999); +#4001=CIRCLE('',#4000,1.); +#4002=EDGE_CURVE('',#1517,#68,#4001,.T.); +#4003=ORIENTED_EDGE('',*,*,#4002,.F.); +#4004=EDGE_LOOP('',(#3995,#3996,#4003)); +#4005=FACE_BOUND('',#4004,.T.); +#4006=ADVANCED_FACE('',(#4005),#3994,.T.); +#4007=CARTESIAN_POINT('',(21.,5.485205765,17.666750919)); +#4008=DIRECTION('',(1.,0.,0.)); +#4009=DIRECTION('',(0.,0.,-1.)); +#4010=AXIS2_PLACEMENT_3D('',#4007,#4008,#4009); +#4011=TOROIDAL_SURFACE('',#4010,9.,1.); +#4012=ORIENTED_EDGE('',*,*,#3788,.T.); +#4013=ORIENTED_EDGE('',*,*,#1444,.F.); +#4014=CARTESIAN_POINT('',(21.,12.062407326,23.810074094)); +#4015=DIRECTION('',(0.,0.682591464,-0.730800173)); +#4016=DIRECTION('',(0.,0.730800173,0.682591464)); +#4017=AXIS2_PLACEMENT_3D('',#4014,#4015,#4016); +#4018=CIRCLE('',#4017,1.); +#4019=EDGE_CURVE('',#51,#719,#4018,.T.); +#4020=ORIENTED_EDGE('',*,*,#4019,.F.); +#4021=ORIENTED_EDGE('',*,*,#57,.F.); +#4022=EDGE_LOOP('',(#4012,#4013,#4020,#4021)); +#4023=FACE_BOUND('',#4022,.T.); +#4024=ADVANCED_FACE('',(#4023),#4011,.T.); +#4025=CARTESIAN_POINT('',(21.,41.858253313,30.)); +#4026=DIRECTION('',(1.,0.,0.)); +#4027=DIRECTION('',(0.,0.,-1.)); +#4028=AXIS2_PLACEMENT_3D('',#4025,#4026,#4027); +#4029=TOROIDAL_SURFACE('',#4028,26.,1.); +#4030=ORIENTED_EDGE('',*,*,#4002,.T.); +#4031=ORIENTED_EDGE('',*,*,#74,.F.); +#4032=CARTESIAN_POINT('',(21.,22.857448803,12.25262194)); +#4033=DIRECTION('',(0.,-0.682591464,0.730800173)); +#4034=DIRECTION('',(0.,-0.730800173,-0.682591464)); +#4035=AXIS2_PLACEMENT_3D('',#4032,#4033,#4034); +#4036=CIRCLE('',#4035,1.); +#4037=EDGE_CURVE('',#711,#60,#4036,.T.); +#4038=ORIENTED_EDGE('',*,*,#4037,.F.); +#4039=ORIENTED_EDGE('',*,*,#1551,.F.); +#4040=EDGE_LOOP('',(#4030,#4031,#4038,#4039)); +#4041=FACE_BOUND('',#4040,.T.); +#4042=ADVANCED_FACE('',(#4041),#4029,.T.); +#4043=CARTESIAN_POINT('',(21.,18.319525326,17.111040834)); +#4044=DIRECTION('',(0.,0.682591464,-0.730800173)); +#4045=DIRECTION('',(0.,0.730800173,0.682591464)); +#4046=AXIS2_PLACEMENT_3D('',#4043,#4044,#4045); +#4047=CYLINDRICAL_SURFACE('',#4046,1.); +#4048=ORIENTED_EDGE('',*,*,#4019,.T.); +#4049=ORIENTED_EDGE('',*,*,#724,.F.); +#4050=ORIENTED_EDGE('',*,*,#4037,.T.); +#4051=ORIENTED_EDGE('',*,*,#65,.F.); +#4052=EDGE_LOOP('',(#4048,#4049,#4050,#4051)); +#4053=FACE_BOUND('',#4052,.T.); +#4054=ADVANCED_FACE('',(#4053),#4047,.T.); +#4055=CARTESIAN_POINT('',(0.,-31.066987298,41.17820323)); +#4056=DIRECTION('',(-1.,0.,0.)); +#4057=DIRECTION('',(0.,0.,1.)); +#4058=AXIS2_PLACEMENT_3D('',#4055,#4056,#4057); +#4059=CYLINDRICAL_SURFACE('',#4058,2.); +#4060=ORIENTED_EDGE('',*,*,#1887,.F.); +#4061=ORIENTED_EDGE('',*,*,#2042,.T.); +#4062=ORIENTED_EDGE('',*,*,#1279,.F.); +#4063=ORIENTED_EDGE('',*,*,#1870,.T.); +#4064=EDGE_LOOP('',(#4060,#4061,#4062,#4063)); +#4065=FACE_BOUND('',#4064,.T.); +#4066=ADVANCED_FACE('',(#4065),#4059,.T.); +#4067=CARTESIAN_POINT('',(-34.586172651,-21.134996607,27.975349798)); +#4068=CARTESIAN_POINT('',(-34.389722684,-21.156940143,28.013342857)); +#4069=CARTESIAN_POINT('',(-34.193338708,-21.14559702,28.070541329)); +#4070=CARTESIAN_POINT('',(-33.828092307,-21.057918083,28.215371134)); +#4071=CARTESIAN_POINT('',(-33.659352573,-20.981611714,28.302953805)); +#4072=CARTESIAN_POINT('',(-33.373174014,-20.774706697,28.496238082)); +#4073=CARTESIAN_POINT('',(-33.25583132,-20.644177551,28.601874743)); +#4074=CARTESIAN_POINT('',(-33.089004639,-20.347170402,28.816401841)); +#4075=CARTESIAN_POINT('',(-33.03957669,-20.180792173,28.925220191)); +#4076=CARTESIAN_POINT('',(-33.027580804,-20.008141571,29.028003658)); +#4077=CARTESIAN_POINT('',(-34.557788376,-21.103214243,27.920354328)); +#4078=CARTESIAN_POINT('',(-34.362361241,-21.123290557,27.958602977)); +#4079=CARTESIAN_POINT('',(-34.166998244,-21.109703221,28.014511995)); +#4080=CARTESIAN_POINT('',(-33.80334002,-21.017077636,28.153942443)); +#4081=CARTESIAN_POINT('',(-33.635164144,-20.938069823,28.237418141)); +#4082=CARTESIAN_POINT('',(-33.349309855,-20.725563244,28.420384455)); +#4083=CARTESIAN_POINT('',(-33.231725266,-20.592134272,28.519815082)); +#4084=CARTESIAN_POINT('',(-33.0634567,-20.289329489,28.720867874)); +#4085=CARTESIAN_POINT('',(-33.012827964,-20.120053116,28.822424137)); +#4086=CARTESIAN_POINT('',(-32.999196529,-19.944576843,28.918012718)); +#4087=CARTESIAN_POINT('',(-34.529876866,-21.074696629,27.863474144)); +#4088=CARTESIAN_POINT('',(-34.335436069,-21.092883705,27.901772378)); +#4089=CARTESIAN_POINT('',(-34.141057653,-21.077125344,27.956191529)); +#4090=CARTESIAN_POINT('',(-33.778932118,-20.979869809,28.089852871)); +#4091=CARTESIAN_POINT('',(-33.611301179,-20.898403869,28.169052218)); +#4092=CARTESIAN_POINT('',(-33.325762488,-20.680908625,28.341394176)); +#4093=CARTESIAN_POINT('',(-33.207946351,-20.544949139,28.434481564)); +#4094=CARTESIAN_POINT('',(-33.038287738,-20.237150797,28.621804112)); +#4095=CARTESIAN_POINT('',(-32.986499709,-20.065410733,28.715979264)); +#4096=CARTESIAN_POINT('',(-32.971285019,-19.887541615,28.804252349)); +#4097=CARTESIAN_POINT('',(-34.412845514,-20.967270888,27.612541738)); +#4098=CARTESIAN_POINT('',(-34.222466004,-20.977456215,27.650129976)); +#4099=CARTESIAN_POINT('',(-34.032141767,-20.952869149,27.697305538)); +#4100=CARTESIAN_POINT('',(-33.676331596,-20.837379759,27.804725448)); +#4101=CARTESIAN_POINT('',(-33.510948988,-20.746511333,27.864939032)); +#4102=CARTESIAN_POINT('',(-33.226720733,-20.510375549,27.990616627)); +#4103=CARTESIAN_POINT('',(-33.107957693,-20.365177171,28.056044928)); +#4104=CARTESIAN_POINT('',(-32.932577033,-20.039430484,28.18367829)); +#4105=CARTESIAN_POINT('',(-32.8760105,-19.858977193,28.245847304)); +#4106=CARTESIAN_POINT('',(-32.854253667,-19.672690133,28.302387537)); +#4107=CARTESIAN_POINT('',(-34.330479618,-20.923159782,27.403690578)); +#4108=CARTESIAN_POINT('',(-34.142771603,-20.927555185,27.438424574)); +#4109=CARTESIAN_POINT('',(-33.95511449,-20.897499762,27.4779395)); +#4110=CARTESIAN_POINT('',(-33.603469886,-20.772274214,27.561598182)); +#4111=CARTESIAN_POINT('',(-33.439577763,-20.677138129,27.605719621)); +#4112=CARTESIAN_POINT('',(-33.15623947,-20.433774564,27.693062341)); +#4113=CARTESIAN_POINT('',(-33.036870173,-20.28561312,27.736260507)); +#4114=CARTESIAN_POINT('',(-32.857729498,-19.954940764,27.8163619)); +#4115=CARTESIAN_POINT('',(-32.798006777,-19.772519531,27.853244103)); +#4116=CARTESIAN_POINT('',(-32.771887771,-19.58446792,27.884685218)); +#4117=CARTESIAN_POINT('',(-34.193024507,-20.918217261,26.984840718)); +#4118=CARTESIAN_POINT('',(-34.009620168,-20.914540326,27.010992725)); +#4119=CARTESIAN_POINT('',(-33.826259936,-20.878344201,27.033138474)); +#4120=CARTESIAN_POINT('',(-33.48133524,-20.745211323,27.06682601)); +#4121=CARTESIAN_POINT('',(-33.319853736,-20.648306672,27.078360074)); +#4122=CARTESIAN_POINT('',(-33.037972277,-20.405300511,27.089501485)); +#4123=CARTESIAN_POINT('',(-32.91764015,-20.259257483,27.089106736)); +#4124=CARTESIAN_POINT('',(-32.732445729,-19.935383546,27.076511559)); +#4125=CARTESIAN_POINT('',(-32.667628051,-19.757630529,27.064314875)); +#4126=CARTESIAN_POINT('',(-32.63443266,-19.574582878,27.046985498)); +#4127=CARTESIAN_POINT('',(-34.137989374,-20.957387791,26.775006817)); +#4128=CARTESIAN_POINT('',(-33.956219738,-20.951452205,26.795478057)); +#4129=CARTESIAN_POINT('',(-33.774491775,-20.914598074,26.807953451)); +#4130=CARTESIAN_POINT('',(-33.432125127,-20.783309337,26.815487797)); +#4131=CARTESIAN_POINT('',(-33.271564935,-20.688904778,26.810545207)); +#4132=CARTESIAN_POINT('',(-32.990250629,-20.453477712,26.783840928)); +#4133=CARTESIAN_POINT('',(-32.869561018,-20.312509081,26.762085626)); +#4134=CARTESIAN_POINT('',(-32.682069219,-20.000341403,26.704321076)); +#4135=CARTESIAN_POINT('',(-32.615310035,-19.829213795,26.668325386)); +#4136=CARTESIAN_POINT('',(-32.579397528,-19.652923938,26.627317695)); +#4137=CARTESIAN_POINT('',(-34.063599204,-21.113108399,26.386148583)); +#4138=CARTESIAN_POINT('',(-33.884011534,-21.107115335,26.395465009)); +#4139=CARTESIAN_POINT('',(-33.704462332,-21.074227598,26.389617966)); +#4140=CARTESIAN_POINT('',(-33.365511825,-20.958335751,26.348268054)); +#4141=CARTESIAN_POINT('',(-33.206183125,-20.875356411,26.312774226)); +#4142=CARTESIAN_POINT('',(-32.925630109,-20.668596864,26.216145986)); +#4143=CARTESIAN_POINT('',(-32.804465896,-20.544860845,26.155032538)); +#4144=CARTESIAN_POINT('',(-32.61390829,-20.270493221,26.014076714)); +#4145=CARTESIAN_POINT('',(-32.544555734,-20.119920256,25.93426485)); +#4146=CARTESIAN_POINT('',(-32.505007357,-19.964365154,25.849601228)); +#4147=CARTESIAN_POINT('',(-34.044273436,-21.229597207,26.207277249)); +#4148=CARTESIAN_POINT('',(-33.865234219,-21.225797557,26.211167644)); +#4149=CARTESIAN_POINT('',(-33.686232696,-21.197526045,26.196705103)); +#4150=CARTESIAN_POINT('',(-33.34814205,-21.095172354,26.132676895)); +#4151=CARTESIAN_POINT('',(-33.189124105,-21.021111725,26.083124708)); +#4152=CARTESIAN_POINT('',(-32.908765398,-20.835430323,25.954435559)); +#4153=CARTESIAN_POINT('',(-32.78748366,-20.723848642,25.87532569)); +#4154=CARTESIAN_POINT('',(-32.596155901,-20.475568844,25.696342347)); +#4155=CARTESIAN_POINT('',(-32.52615016,-20.338922996,25.596506555)); +#4156=CARTESIAN_POINT('',(-32.485681589,-20.197342772,25.49185856)); +#4157=CARTESIAN_POINT('',(-34.044273436,-21.37593555,26.057444016)); +#4158=CARTESIAN_POINT('',(-33.865234219,-21.37593555,26.057444016)); +#4159=CARTESIAN_POINT('',(-33.686232696,-21.354236974,26.036251563)); +#4160=CARTESIAN_POINT('',(-33.34814205,-21.269847311,25.953830306)); +#4161=CARTESIAN_POINT('',(-33.189124105,-21.207173991,25.892618854)); +#4162=CARTESIAN_POINT('',(-32.908765398,-21.047815856,25.73697778)); +#4163=CARTESIAN_POINT('',(-32.78748366,-20.95116459,25.642580924)); +#4164=CARTESIAN_POINT('',(-32.596155901,-20.73462859,25.431095669)); +#4165=CARTESIAN_POINT('',(-32.52615016,-20.614789443,25.314051794)); +#4166=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094)); +#4167=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#4067,#4068,#4069,#4070,#4071,#4072,#4073,#4074,#4075,#4076),(#4077,#4078,#4079,#4080,#4081,#4082,#4083,#4084,#4085,#4086),(#4087,#4088,#4089,#4090,#4091,#4092,#4093,#4094,#4095,#4096),(#4097,#4098,#4099,#4100,#4101,#4102,#4103,#4104,#4105,#4106),(#4107,#4108,#4109,#4110,#4111,#4112,#4113,#4114,#4115,#4116),(#4117,#4118,#4119,#4120,#4121,#4122,#4123,#4124,#4125,#4126),(#4127,#4128,#4129,#4130,#4131,#4132,#4133,#4134,#4135,#4136),(#4137,#4138,#4139,#4140,#4141,#4142,#4143,#4144,#4145,#4146),(#4147,#4148,#4149,#4150,#4151,#4152,#4153,#4154,#4155,#4156),(#4157,#4158,#4159,#4160,#4161,#4162,#4163,#4164,#4165,#4166)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,4),(4,2,2,2,4),(4.985986455,5.105088062,5.497787144,5.890486225,6.283185307),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.); +#4168=ORIENTED_EDGE('',*,*,#2205,.T.); +#4169=ORIENTED_EDGE('',*,*,#2122,.T.); +#4170=ORIENTED_EDGE('',*,*,#765,.F.); +#4171=ORIENTED_EDGE('',*,*,#951,.F.); +#4172=ORIENTED_EDGE('',*,*,#1352,.F.); +#4173=EDGE_LOOP('',(#4168,#4169,#4170,#4171,#4172)); +#4174=FACE_BOUND('',#4173,.T.); +#4175=ADVANCED_FACE('',(#4174),#4167,.F.); +#4176=CLOSED_SHELL('',(#93,#160,#254,#354,#454,#516,#547,#564,#581,#613,#653,#702,#742,#917,#955,#1004,#1044,#1067,#1092,#1117,#1196,#1227,#1258,#1289,#1306,#1357, +#1384,#1408,#1432,#1456,#1510,#1564,#1609,#1655,#1700,#1746,#1788,#1830,#1848,#1875,#1900,#1914,#2054,#2072,#2090,#2107,#2134,#2152,#2212,#2231,#2249, +#2267,#2285,#2303,#2321,#2339,#2356,#2374,#2392,#2409,#2427,#2445,#2463,#2481,#2499,#2512,#2530,#2548,#2560,#2834,#3028,#3046,#3064,#3277,#3295,#3307, +#3581,#3775,#3793,#4006,#4024,#4042,#4054,#4066,#4175)); +#4177=MANIFOLD_SOLID_BREP('\X2\5B9E4F53\X0\ 01',#4176); +#4178=COLOUR_RGB('',0.494117647,0.494117647,0.525490224); +#4179=FILL_AREA_STYLE_COLOUR('',#4178); +#4180=FILL_AREA_STYLE('',(#4179)); +#4181=SURFACE_STYLE_FILL_AREA(#4180); +#4182=SURFACE_SIDE_STYLE('',(#4181)); +#4183=SURFACE_STYLE_USAGE(.BOTH.,#4182); +#4184=PRESENTATION_STYLE_ASSIGNMENT((#4183)); +#26=STYLED_ITEM('',(#4184),#4177); +#16=SHAPE_REPRESENTATION('root',(#15),#10); +#17=ADVANCED_BREP_SHAPE_REPRESENTATION('root',(#4177),#10); +#4192=SHAPE_REPRESENTATION_RELATIONSHIP('','',#16,#17); +#4193=APPLICATION_CONTEXT('data for automotive mechanical design processes'); +#4194=APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',1994,#4193); +#4195=PRODUCT_CONTEXT('',#4193,'mechanical'); +#4196=PRODUCT_DEFINITION_CONTEXT('part definition',#4193,'design'); +#24=PRODUCT('root','root','',(#4195)); +#4197=PRODUCT_RELATED_PRODUCT_CATEGORY('part','',(#24)); +#4198=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#24,.NOT_KNOWN.); +#25=PRODUCT_DEFINITION('design','',#4198,#4196); +#23=PRODUCT_DEFINITION_SHAPE('','',#25); +#4199=SHAPE_DEFINITION_REPRESENTATION(#23,#16); +#11=DRAUGHTING_MODEL('',(),#10); +#1=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#26),#10); +ENDSEC; +END-ISO-10303-21; diff --git a/images/go1_camMount_30Down.png b/images/go1_camMount_30Down.png new file mode 100644 index 0000000..ddc53a8 Binary files /dev/null and b/images/go1_camMount_30Down.png differ diff --git a/onboard_script/a1_real.py b/onboard_script/a1_real.py new file mode 100644 index 0000000..36e8274 --- /dev/null +++ b/onboard_script/a1_real.py @@ -0,0 +1,489 @@ +import numpy as np +import torch +import torch.nn.functional as F +from torch.autograd import Variable +import json +import os +import os.path as osp +from collections import OrderedDict +from typing import Tuple + +import rospy +from unitree_legged_msgs.msg import LowState +from unitree_legged_msgs.msg import LegsCmd +from unitree_legged_msgs.msg import Float32MultiArrayStamped +from std_msgs.msg import Float32MultiArray +from geometry_msgs.msg import Twist, Pose +from nav_msgs.msg import Odometry +from sensor_msgs.msg import Image + +import ros_numpy + +@torch.no_grad() +def resize2d(img, size): + return (F.adaptive_avg_pool2d(Variable(img), size)).data + +@torch.jit.script +def quat_rotate_inverse(q, v): + shape = q.shape + q_w = q[:, -1] + q_vec = q[:, :3] + a = v * (2.0 * q_w ** 2 - 1.0).unsqueeze(-1) + b = torch.cross(q_vec, v, dim=-1) * q_w.unsqueeze(-1) * 2.0 + c = q_vec * \ + torch.bmm(q_vec.view(shape[0], 1, 3), v.view( + shape[0], 3, 1)).squeeze(-1) * 2.0 + return a - b + c + +class UnitreeA1Real: + """ This is the handler that works for ROS 1 on unitree. """ + def __init__(self, + robot_namespace= "a112138", + low_state_topic= "/low_state", + legs_cmd_topic= "/legs_cmd", + forward_depth_topic = "/camera/depth/image_rect_raw", + forward_depth_embedding_dims = None, + odom_topic= "/odom/filtered", + lin_vel_deadband= 0.1, + ang_vel_deadband= 0.1, + move_by_wireless_remote= False, # if True, command will not listen to move_cmd_subscriber, but wireless remote. + cfg= dict(), + extra_cfg= dict(), + model_device= torch.device("cpu"), + ): + """ + NOTE: + * Must call start_ros() before using this class's get_obs() and send_action() + * Joint order of simulation and of real A1 protocol are different, see dof_names + * We store all joints values in the order of simulation in this class + Args: + forward_depth_embedding_dims: If a real number, the obs will not be built as a normal env. + The segment of obs will be subsituted by the embedding of forward depth image from the + ROS topic. + cfg: same config from a1_config but a dict object. + extra_cfg: some other configs that is hard to load from file. + """ + self.model_device = model_device + self.num_envs = 1 + self.robot_namespace = robot_namespace + self.low_state_topic = low_state_topic + self.legs_cmd_topic = legs_cmd_topic + self.forward_depth_topic = forward_depth_topic + self.forward_depth_embedding_dims = forward_depth_embedding_dims + self.odom_topic = odom_topic + self.lin_vel_deadband = lin_vel_deadband + self.ang_vel_deadband = ang_vel_deadband + self.move_by_wireless_remote = move_by_wireless_remote + self.cfg = cfg + self.extra_cfg = dict( + torque_limits= torch.tensor([33.5] * 12, dtype= torch.float32, device= self.model_device, requires_grad= False), # Nm + # torque_limits= torch.tensor([1, 5, 5] * 4, dtype= torch.float32, device= self.model_device, requires_grad= False), # Nm + dof_map= [ # from isaacgym simulation joint order to URDF order + 3, 4, 5, + 0, 1, 2, + 9, 10,11, + 6, 7, 8, + ], # real_joint_idx = dof_map[sim_joint_idx] + dof_names= [ # NOTE: order matters. This list is the order in simulation. + "FL_hip_joint", + "FL_thigh_joint", + "FL_calf_joint", + + "FR_hip_joint", + "FR_thigh_joint", + "FR_calf_joint", + + "RL_hip_joint", + "RL_thigh_joint", + "RL_calf_joint", + + "RR_hip_joint", + "RR_thigh_joint", + "RR_calf_joint", + ], + # motor strength is multiplied directly to the action. + motor_strength= torch.ones(12, dtype= torch.float32, device= self.model_device, requires_grad= False), + ); self.extra_cfg.update(extra_cfg) + if "torque_limits" in self.cfg["control"]: + if isinstance(self.cfg["control"]["torque_limits"], (tuple, list)): + for i in range(len(self.cfg["control"]["torque_limits"])): + self.extra_cfg["torque_limits"][i] = self.cfg["control"]["torque_limits"][i] + else: + self.extra_cfg["torque_limits"][:] = self.cfg["control"]["torque_limits"] + self.command_buf = torch.zeros((self.num_envs, 3,), device= self.model_device, dtype= torch.float32) # zeros for initialization + self.actions = torch.zeros((1, 12), device= model_device, dtype= torch.float32) + + self.process_configs() + + def start_ros(self): + # initialze several buffers so that the system works even without message update. + # self.low_state_buffer = LowState() # not initialized, let input message update it. + self.base_position_buffer = torch.zeros((self.num_envs, 3), device= self.model_device, requires_grad= False) + self.legs_cmd_publisher = rospy.Publisher( + self.robot_namespace + self.legs_cmd_topic, + LegsCmd, + queue_size= 1, + ) + # self.debug_publisher = rospy.Publisher( + # "/DNNmodel_debug", + # Float32MultiArray, + # queue_size= 1, + # ) + # NOTE: this launches the subscriber callback function + self.low_state_subscriber = rospy.Subscriber( + self.robot_namespace + self.low_state_topic, + LowState, + self.update_low_state, + queue_size= 1, + ) + self.odom_subscriber = rospy.Subscriber( + self.robot_namespace + self.odom_topic, + Odometry, + self.update_base_pose, + queue_size= 1, + ) + if not self.move_by_wireless_remote: + self.move_cmd_subscriber = rospy.Subscriber( + "/cmd_vel", + Twist, + self.update_move_cmd, + queue_size= 1, + ) + if "forward_depth" in self.all_obs_components: + if not self.forward_depth_embedding_dims: + self.forward_depth_subscriber = rospy.Subscriber( + self.robot_namespace + self.forward_depth_topic, + Image, + self.update_forward_depth, + queue_size= 1, + ) + else: + self.forward_depth_subscriber = rospy.Subscriber( + self.robot_namespace + self.forward_depth_topic, + Float32MultiArrayStamped, + self.update_forward_depth_embedding, + queue_size= 1, + ) + self.pose_cmd_subscriber = rospy.Subscriber( + "/body_pose", + Pose, + self.dummy_handler, + queue_size= 1, + ) + + def wait_untill_ros_working(self): + rate = rospy.Rate(100) + while not hasattr(self, "low_state_buffer"): + rate.sleep() + rospy.loginfo("UnitreeA1Real.low_state_buffer acquired, stop waiting.") + + def process_configs(self): + self.up_axis_idx = 2 # 2 for z, 1 for y -> adapt gravity accordingly + self.gravity_vec = torch.zeros((self.num_envs, 3), dtype= torch.float32) + self.gravity_vec[:, self.up_axis_idx] = -1 + + self.obs_scales = self.cfg["normalization"]["obs_scales"] + self.obs_scales["dof_pos"] = torch.tensor(self.obs_scales["dof_pos"], device= self.model_device, dtype= torch.float32) + if not isinstance(self.cfg["control"]["damping"]["joint"], (list, tuple)): + self.cfg["control"]["damping"]["joint"] = [self.cfg["control"]["damping"]["joint"]] * 12 + if not isinstance(self.cfg["control"]["stiffness"]["joint"], (list, tuple)): + self.cfg["control"]["stiffness"]["joint"] = [self.cfg["control"]["stiffness"]["joint"]] * 12 + self.d_gains = torch.tensor(self.cfg["control"]["damping"]["joint"], device= self.model_device, dtype= torch.float32) + self.p_gains = torch.tensor(self.cfg["control"]["stiffness"]["joint"], device= self.model_device, dtype= torch.float32) + self.default_dof_pos = torch.zeros(12, device= self.model_device, dtype= torch.float32) + for i in range(12): + name = self.extra_cfg["dof_names"][i] + default_joint_angle = self.cfg["init_state"]["default_joint_angles"][name] + self.default_dof_pos[i] = default_joint_angle + + self.computer_clip_torque = self.cfg["control"].get("computer_clip_torque", True) + rospy.loginfo("Computer Clip Torque (onboard) is " + str(self.computer_clip_torque)) + if self.computer_clip_torque: + self.torque_limits = self.extra_cfg["torque_limits"] + rospy.loginfo("[Env] torque limit: {:.1f} {:.1f} {:.1f}".format(*self.torque_limits[:3])) + + self.commands_scale = torch.tensor([ + self.obs_scales["lin_vel"], + self.obs_scales["lin_vel"], + self.obs_scales["lin_vel"], + ], device= self.model_device, requires_grad= False) + + self.obs_segments = self.get_obs_segment_from_components(self.cfg["env"]["obs_components"]) + self.num_obs = self.get_num_obs_from_components(self.cfg["env"]["obs_components"]) + components = self.cfg["env"].get("privileged_obs_components", None) + self.privileged_obs_segments = None if components is None else self.get_num_obs_from_components(components) + self.num_privileged_obs = None if components is None else self.get_num_obs_from_components(components) + self.all_obs_components = self.cfg["env"]["obs_components"] + (self.cfg["env"].get("privileged_obs_components", []) if components is not None else []) + + # store config values to attributes to improve speed + self.clip_obs = self.cfg["normalization"]["clip_observations"] + self.control_type = self.cfg["control"]["control_type"] + self.action_scale = self.cfg["control"]["action_scale"] + rospy.loginfo("[Env] action scale: {:.1f}".format(self.action_scale)) + self.clip_actions = self.cfg["normalization"]["clip_actions"] + if self.cfg["normalization"].get("clip_actions_method", None) == "hard": + rospy.loginfo("clip_actions_method with hard mode") + rospy.loginfo("clip_actions_high: " + str(self.cfg["normalization"]["clip_actions_high"])) + rospy.loginfo("clip_actions_low: " + str(self.cfg["normalization"]["clip_actions_low"])) + self.clip_actions_method = "hard" + self.clip_actions_low = torch.tensor(self.cfg["normalization"]["clip_actions_low"], device= self.model_device, dtype= torch.float32) + self.clip_actions_high = torch.tensor(self.cfg["normalization"]["clip_actions_high"], device= self.model_device, dtype= torch.float32) + else: + rospy.loginfo("clip_actions_method is " + str(self.cfg["normalization"].get("clip_actions_method", None))) + self.dof_map = self.extra_cfg["dof_map"] + + # get ROS params for hardware configs + self.joint_limits_high = torch.tensor([ + rospy.get_param(self.robot_namespace + "/joint_limits/{}_max".format(s)) \ + for s in ["hip", "thigh", "calf"] * 4 + ]) + self.joint_limits_low = torch.tensor([ + rospy.get_param(self.robot_namespace + "/joint_limits/{}_min".format(s)) \ + for s in ["hip", "thigh", "calf"] * 4 + ]) + + if "forward_depth" in self.all_obs_components: + resolution = self.cfg["sensor"]["forward_camera"].get( + "output_resolution", + self.cfg["sensor"]["forward_camera"]["resolution"], + ) + if not self.forward_depth_embedding_dims: + self.forward_depth_buf = torch.zeros( + (self.num_envs, *resolution), + device= self.model_device, + dtype= torch.float32, + ) + else: + self.forward_depth_embedding_buf = torch.zeros( + (1, self.forward_depth_embedding_dims), + device= self.model_device, + dtype= torch.float32, + ) + + def _init_height_points(self): + """ Returns points at which the height measurments are sampled (in base frame) + + Returns: + [torch.Tensor]: Tensor of shape (num_envs, self.num_height_points, 3) + """ + return None + + def _get_heights(self): + """ TODO: get estimated terrain heights around the robot base """ + # currently return a zero tensor with valid size + return torch.zeros(self.num_envs, 187, device= self.model_device, requires_grad= False) + + def clip_action_before_scale(self, actions): + actions = torch.clip(actions, -self.clip_actions, self.clip_actions) + if getattr(self, "clip_actions_method", None) == "hard": + actions = torch.clip(actions, self.clip_actions_low, self.clip_actions_high) + + return actions + + def clip_by_torque_limit(self, actions_scaled): + """ Different from simulation, we reverse the process and clip the actions directly, + so that the PD controller runs in robot but not our script. + """ + control_type = self.cfg["control"]["control_type"] + if control_type == "P": + p_limits_low = (-self.torque_limits) + self.d_gains*self.dof_vel + p_limits_high = (self.torque_limits) + self.d_gains*self.dof_vel + actions_low = (p_limits_low/self.p_gains) - self.default_dof_pos + self.dof_pos + actions_high = (p_limits_high/self.p_gains) - self.default_dof_pos + self.dof_pos + else: + raise NotImplementedError + + return torch.clip(actions_scaled, actions_low, actions_high) + + """ Get obs components and cat to a single obs input """ + def _get_proprioception_obs(self): + # base_ang_vel = quat_rotate_inverse( + # torch.tensor(self.low_state_buffer.imu.quaternion).unsqueeze(0), + # torch.tensor(self.low_state_buffer.imu.gyroscope).unsqueeze(0), + # ).to(self.model_device) + # NOTE: Different from the isaacgym. + # The anglar velocity is already in base frame, no need to rotate + base_ang_vel = torch.tensor(self.low_state_buffer.imu.gyroscope, device= self.model_device).unsqueeze(0) + projected_gravity = quat_rotate_inverse( + torch.tensor(self.low_state_buffer.imu.quaternion).unsqueeze(0), + self.gravity_vec, + ).to(self.model_device) + self.dof_pos = dof_pos = torch.tensor([ + self.low_state_buffer.motorState[self.dof_map[i]].q for i in range(12) + ], dtype= torch.float32, device= self.model_device).unsqueeze(0) + self.dof_vel = dof_vel = torch.tensor([ + self.low_state_buffer.motorState[self.dof_map[i]].dq for i in range(12) + ], dtype= torch.float32, device= self.model_device).unsqueeze(0) + + # rospy.loginfo_throttle(5, + # "projected_gravity: " + \ + # ", ".join([str(i) for i in projected_gravity[0].cpu().tolist()]) + # ) + # rospy.loginfo_throttle(5, "Hacking projected_gravity y -= 0.15") + # projected_gravity[:, 1] -= 0.15 + + return torch.cat([ + torch.zeros((1, 3), device= self.model_device), # no linear velocity + base_ang_vel * self.obs_scales["ang_vel"], + projected_gravity, + self.command_buf * self.commands_scale, + (dof_pos - self.default_dof_pos) * self.obs_scales["dof_pos"], + dof_vel * self.obs_scales["dof_vel"], + self.actions + ], dim= -1) + + def _get_forward_depth_obs(self): + if not self.forward_depth_embedding_dims: + return self.forward_depth_buf.flatten(start_dim= 1) + else: + if self.low_state_get_time.to_sec() - self.forward_depth_embedding_stamp.to_sec() > 0.4: + rospy.logerr("Getting depth embedding later than low_state later than 0.4s") + return self.forward_depth_embedding_buf.flatten(start_dim= 1) + + def compute_observation(self): + """ use the updated low_state_buffer to compute observation vector """ + assert hasattr(self, "legs_cmd_publisher"), "start_ros() not called, ROS handlers are not initialized!" + obs_segments = self.obs_segments + obs = [] + for k, v in obs_segments.items(): + obs.append( + getattr(self, "_get_" + k + "_obs")() * \ + self.obs_scales.get(k, 1.) + ) + obs = torch.cat(obs, dim= 1) + self.obs_buf = obs + + """ The methods combined with outer model forms the step function + NOTE: the outer user handles the loop frequency. + """ + def send_action(self, actions): + """ The function that send commands to the real robot. + """ + self.actions = self.clip_action_before_scale(actions) + if self.computer_clip_torque: + robot_coordinates_action = self.clip_by_torque_limit(actions * self.action_scale) + self.default_dof_pos.unsqueeze(0) + else: + rospy.logwarn_throttle(60, "You are using control without any torque clip. The network might output torques larger than the system can provide.") + robot_coordinates_action = self.actions * self.action_scale + self.default_dof_pos.unsqueeze(0) + + # debugging and logging + # transfered_action = torch.zeros_like(self.actions[0]) + # for i in range(12): + # transfered_action[self.dof_map[i]] = self.actions[0, i] + self.default_dof_pos[i] + # self.debug_publisher.publish(Float32MultiArray(data= + # transfered_action\ + # .cpu().numpy().astype(np.float32).tolist() + # )) + + # restrict the target action delta in order to avoid robot shutdown (maybe there is another solution) + # robot_coordinates_action = torch.clip( + # robot_coordinates_action, + # self.dof_pos - 0.3, + # self.dof_pos + 0.3, + # ) + + # wrap the message and publish + self.publish_legs_cmd(robot_coordinates_action) + + def publish_legs_cmd(self, robot_coordinates_action, kp= None, kd= None): + """ publish the joint position directly to the robot. NOTE: The joint order from input should + be in simulation order. The value should be absolute value rather than related to dof_pos. + """ + robot_coordinates_action = torch.clip( + robot_coordinates_action.cpu(), + self.joint_limits_low, + self.joint_limits_high, + ) + legs_cmd = LegsCmd() + for sim_joint_idx in range(12): + real_joint_idx = self.dof_map[sim_joint_idx] + legs_cmd.cmd[real_joint_idx].mode = 10 + legs_cmd.cmd[real_joint_idx].q = robot_coordinates_action[0, sim_joint_idx] if self.control_type == "P" else rospy.get_param(self.robot_namespace + "/PosStopF", (2.146e+9)) + legs_cmd.cmd[real_joint_idx].dq = 0. + legs_cmd.cmd[real_joint_idx].tau = 0. + legs_cmd.cmd[real_joint_idx].Kp = self.p_gains[sim_joint_idx] if kp is None else kp + legs_cmd.cmd[real_joint_idx].Kd = self.d_gains[sim_joint_idx] if kd is None else kd + self.legs_cmd_publisher.publish(legs_cmd) + + def get_obs(self): + """ The function that refreshes the buffer and return the observation vector. + """ + self.compute_observation() + self.obs_buf = torch.clip(self.obs_buf, -self.clip_obs, self.clip_obs) + return self.obs_buf.to(self.model_device) + + """ Copied from legged_robot_field. Please check whether these are consistent. """ + def get_obs_segment_from_components(self, components): + segments = OrderedDict() + if "proprioception" in components: + segments["proprioception"] = (48,) + if "height_measurements" in components: + segments["height_measurements"] = (187,) + if "forward_depth" in components: + resolution = self.cfg["sensor"]["forward_camera"].get( + "output_resolution", + self.cfg["sensor"]["forward_camera"]["resolution"], + ) + segments["forward_depth"] = (1, *resolution) + # The following components are only for rebuilding the non-actor module. + # DO NOT use these in actor network and check consistency with simulator implementation. + if "base_pose" in components: + segments["base_pose"] = (6,) # xyz + rpy + if "robot_config" in components: + segments["robot_config"] = (1 + 3 + 1 + 12,) + if "engaging_block" in components: + # This could be wrong, please check the implementation of BarrierTrack + segments["engaging_block"] = (1 + (4 + 1) + 2,) + if "sidewall_distance" in components: + segments["sidewall_distance"] = (2,) + return segments + + def get_num_obs_from_components(self, components): + obs_segments = self.get_obs_segment_from_components(components) + num_obs = 0 + for k, v in obs_segments.items(): + num_obs += np.prod(v) + return num_obs + + """ ROS callbacks and handlers that update the buffer """ + def update_low_state(self, ros_msg): + self.low_state_buffer = ros_msg + if self.move_by_wireless_remote: + self.command_buf[0, 0] = self.low_state_buffer.wirelessRemote.ly + self.command_buf[0, 1] = -self.low_state_buffer.wirelessRemote.lx # right-moving stick is positive + self.command_buf[0, 2] = -self.low_state_buffer.wirelessRemote.rx # right-moving stick is positive + # set the command to zero if it is too small + if np.linalg.norm(self.command_buf[0, :2]) < self.lin_vel_deadband: + self.command_buf[0, :2] = 0. + if np.abs(self.command_buf[0, 2]) < self.ang_vel_deadband: + self.command_buf[0, 2] = 0. + self.low_state_get_time = rospy.Time.now() + + def update_base_pose(self, ros_msg): + """ update robot odometry for position """ + self.base_position_buffer[0, 0] = ros_msg.pose.pose.position.x + self.base_position_buffer[0, 1] = ros_msg.pose.pose.position.y + self.base_position_buffer[0, 2] = ros_msg.pose.pose.position.z + + def update_move_cmd(self, ros_msg): + self.command_buf[0, 0] = ros_msg.linear.x + self.command_buf[0, 1] = ros_msg.linear.y + self.command_buf[0, 2] = ros_msg.angular.z + + def update_forward_depth(self, ros_msg): + # TODO not checked. + self.forward_depth_header = ros_msg.header + buf = ros_numpy.numpify(ros_msg) + self.forward_depth_buf = resize2d( + torch.from_numpy(buf.astype(np.float32)).unsqueeze(0).unsqueeze(0).to(self.model_device), + self.forward_depth_buf.shape[-2:], + ) + + def update_forward_depth_embedding(self, ros_msg): + rospy.loginfo_once("a1_ros_run recieved forward depth embedding.") + self.forward_depth_embedding_stamp = ros_msg.header.stamp + self.forward_depth_embedding_buf[:] = torch.tensor(ros_msg.data).unsqueeze(0) # (1, d) + + def dummy_handler(self, ros_msg): + """ To meet the need of teleop-legged-robots requirements """ + pass diff --git a/onboard_script/a1_ros_run.py b/onboard_script/a1_ros_run.py new file mode 100644 index 0000000..9e37b32 --- /dev/null +++ b/onboard_script/a1_ros_run.py @@ -0,0 +1,402 @@ +#!/home/unitree/agility_ziwenz_venv/bin/python +import os +import os.path as osp +import json +import numpy as np +import torch +from collections import OrderedDict +from functools import partial +from typing import Tuple + +import rospy +from std_msgs.msg import Float32MultiArray +from sensor_msgs.msg import Image +import ros_numpy + +from a1_real import UnitreeA1Real, resize2d +from rsl_rl import modules +from rsl_rl.utils.utils import get_obs_slice + +@torch.no_grad() +def handle_forward_depth(ros_msg, model, publisher, output_resolution, device): + """ The callback function to handle the forward depth and send the embedding through ROS topic """ + buf = ros_numpy.numpify(ros_msg).astype(np.float32) + forward_depth_buf = resize2d( + torch.from_numpy(buf).unsqueeze(0).unsqueeze(0).to(device), + output_resolution, + ) + embedding = model(forward_depth_buf) + ros_data = embedding.reshape(-1).cpu().numpy().astype(np.float32) + publisher.publish(Float32MultiArray(data= ros_data.tolist())) + +class StandOnlyModel(torch.nn.Module): + def __init__(self, action_scale, dof_pos_scale, tolerance= 0.2, delta= 0.1): + rospy.loginfo("Using stand only model, please make sure the proprioception is 48 dim.") + rospy.loginfo("Using stand only model, -36 to -24 must be joint position.") + super().__init__() + if isinstance(action_scale, (tuple, list)): + self.register_buffer("action_scale", torch.tensor(action_scale)) + else: + self.action_scale = action_scale + if isinstance(dof_pos_scale, (tuple, list)): + self.register_buffer("dof_pos_scale", torch.tensor(dof_pos_scale)) + else: + self.dof_pos_scale = dof_pos_scale + self.tolerance = tolerance + self.delta = delta + + def forward(self, obs): + joint_positions = obs[..., -36:-24] / self.dof_pos_scale + diff_large_mask = torch.abs(joint_positions) > self.tolerance + target_positions = torch.zeros_like(joint_positions) + target_positions[diff_large_mask] = joint_positions[diff_large_mask] - self.delta * torch.sign(joint_positions[diff_large_mask]) + return torch.clip( + target_positions / self.action_scale, + -1.0, 1.0, + ) + + def reset(self, *args, **kwargs): + pass + +def load_walk_policy(env, model_dir): + """ Load the walk policy from the model directory """ + if model_dir == None: + model = StandOnlyModel( + action_scale= env.action_scale, + dof_pos_scale= env.obs_scales["dof_pos"], + ) + policy = torch.jit.script(model) + + else: + with open(osp.join(model_dir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + obs_components = config_dict["env"]["obs_components"] + privileged_obs_components = config_dict["env"].get("privileged_obs_components", obs_components) + model = getattr(modules, config_dict["runner"]["policy_class_name"])( + num_actor_obs= env.get_num_obs_from_components(obs_components), + num_critic_obs= env.get_num_obs_from_components(privileged_obs_components), + num_actions= 12, + **config_dict["policy"], + ) + model_names = [i for i in os.listdir(model_dir) if i.startswith("model_")] + model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0])) + state_dict = torch.load(osp.join(model_dir, model_names[-1]), map_location= "cpu") + model.load_state_dict(state_dict["model_state_dict"]) + model_action_scale = torch.tensor(config_dict["control"]["action_scale"]) if isinstance(config_dict["control"]["action_scale"], (tuple, list)) else torch.tensor([config_dict["control"]["action_scale"]])[0] + if not (torch.is_tensor(model_action_scale) and (model_action_scale == env.action_scale).all()): + action_rescale_ratio = model_action_scale / env.action_scale + print("walk_policy action scaling:", action_rescale_ratio.tolist()) + else: + action_rescale_ratio = 1.0 + memory_module = model.memory_a + actor_mlp = model.actor + @torch.jit.script + def policy_run(obs): + recurrent_embedding = memory_module(obs) + actions = actor_mlp(recurrent_embedding.squeeze(0)) + return actions + if (torch.is_tensor(action_rescale_ratio) and (action_rescale_ratio == 1.).all()) \ + or (not torch.is_tensor(action_rescale_ratio) and action_rescale_ratio == 1.): + policy = policy_run + else: + policy = lambda x: policy_run(x) * action_rescale_ratio + + return policy, model + +def standup_procedure(env, ros_rate, angle_tolerance= 0.1, + kp= None, + kd= None, + warmup_timesteps= 25, + device= "cpu", + ): + """ + Args: + warmup_timesteps: the number of timesteps to linearly increase the target position + """ + rospy.loginfo("Robot standing up, please wait ...") + + target_pos = torch.zeros((1, 12), device= device, dtype= torch.float32) + standup_timestep_i = 0 + while not rospy.is_shutdown(): + dof_pos = [env.low_state_buffer.motorState[env.dof_map[i]].q for i in range(12)] + diff = [env.default_dof_pos[i].item() - dof_pos[i] for i in range(12)] + direction = [1 if i > 0 else -1 for i in diff] + if standup_timestep_i < warmup_timesteps: + direction = [standup_timestep_i / warmup_timesteps * i for i in direction] + if all([abs(i) < angle_tolerance for i in diff]): + break + print("max joint error (rad):", max([abs(i) for i in diff]), end= "\r") + for i in range(12): + target_pos[0, i] = dof_pos[i] + direction[i] * angle_tolerance if abs(diff[i]) > angle_tolerance else env.default_dof_pos[i] + env.publish_legs_cmd(target_pos, + kp= kp, + kd= kd, + ) + ros_rate.sleep() + standup_timestep_i += 1 + + rospy.loginfo("Robot stood up! press R1 on the remote control to continue ...") + while not rospy.is_shutdown(): + if env.low_state_buffer.wirelessRemote.btn.components.R1: + break + if env.low_state_buffer.wirelessRemote.btn.components.L2 or env.low_state_buffer.wirelessRemote.btn.components.R2: + env.publish_legs_cmd(env.default_dof_pos.unsqueeze(0), kp= 0, kd= 0.5) + rospy.signal_shutdown("Controller send stop signal, exiting") + exit(0) + env.publish_legs_cmd(env.default_dof_pos.unsqueeze(0), kp= kp, kd= kd) + ros_rate.sleep() + rospy.loginfo("Robot standing up procedure finished!") + +class SkilledA1Real(UnitreeA1Real): + """ Some additional methods to help the execution of skill policy """ + def __init__(self, *args, + skill_mode_threhold= 0.1, + skill_vel_range= [0.0, 1.0], + **kwargs, + ): + self.skill_mode_threhold = skill_mode_threhold + self.skill_vel_range = skill_vel_range + super().__init__(*args, **kwargs) + + def is_skill_mode(self): + if self.move_by_wireless_remote: + return self.low_state_buffer.wirelessRemote.ry > self.skill_mode_threhold + else: + # Not implemented yet + return False + + def update_low_state(self, ros_msg): + self.low_state_buffer = ros_msg + if self.move_by_wireless_remote and ros_msg.wirelessRemote.ry > self.skill_mode_threhold: + skill_vel = (self.low_state_buffer.wirelessRemote.ry - self.skill_mode_threhold) / (1.0 - self.skill_mode_threhold) + skill_vel *= self.skill_vel_range[1] - self.skill_vel_range[0] + skill_vel += self.skill_vel_range[0] + self.command_buf[0, 0] = skill_vel + self.command_buf[0, 1] = 0. + self.command_buf[0, 2] = 0. + return + return super().update_low_state(ros_msg) + +def main(args): + log_level = rospy.DEBUG if args.debug else rospy.INFO + rospy.init_node("a1_legged_gym_" + args.mode, log_level= log_level) + + """ Not finished this modification yet """ + # if args.logdir is not None: + # rospy.loginfo("Use logdir/config.json to initialize env proxy.") + # with open(osp.join(args.logdir, "config.json"), "r") as f: + # config_dict = json.load(f, object_pairs_hook= OrderedDict) + # else: + # assert args.walkdir is not None, "You must provide at least a --logdir or --walkdir" + # rospy.logwarn("You did not provide logdir, use walkdir/config.json for initializing env proxy.") + # with open(osp.join(args.walkdir, "config.json"), "r") as f: + # config_dict = json.load(f, object_pairs_hook= OrderedDict) + assert args.logdir is not None + with open(osp.join(args.logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + + duration = config_dict["sim"]["dt"] * config_dict["control"]["decimation"] # in sec + # config_dict["control"]["stiffness"]["joint"] -= 2.5 # kp + + model_device = torch.device("cpu") if args.mode == "upboard" else torch.device("cuda") + + unitree_real_env = SkilledA1Real( + robot_namespace= args.namespace, + cfg= config_dict, + forward_depth_topic= "/visual_embedding" if args.mode == "upboard" else "/camera/depth/image_rect_raw", + forward_depth_embedding_dims= config_dict["policy"]["visual_latent_size"] if args.mode == "upboard" else None, + move_by_wireless_remote= True, + skill_vel_range= config_dict["commands"]["ranges"]["lin_vel_x"], + model_device= model_device, + # extra_cfg= dict( + # motor_strength= torch.tensor([ + # 1., 1./0.9, 1./0.9, + # 1., 1./0.9, 1./0.9, + # 1., 1., 1., + # 1., 1., 1., + # ], dtype= torch.float32, device= model_device, requires_grad= False), + # ), + ) + + model = getattr(modules, config_dict["runner"]["policy_class_name"])( + num_actor_obs= unitree_real_env.num_obs, + num_critic_obs= unitree_real_env.num_privileged_obs, + num_actions= 12, + obs_segments= unitree_real_env.obs_segments, + privileged_obs_segments= unitree_real_env.privileged_obs_segments, + **config_dict["policy"], + ) + config_dict["terrain"]["measure_heights"] = False + # load the model with the latest checkpoint + model_names = [i for i in os.listdir(args.logdir) if i.startswith("model_")] + model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0])) + state_dict = torch.load(osp.join(args.logdir, model_names[-1]), map_location= "cpu") + model.load_state_dict(state_dict["model_state_dict"]) + model.to(model_device) + model.eval() + + rospy.loginfo("duration: {}, motor Kp: {}, motor Kd: {}".format( + duration, + config_dict["control"]["stiffness"]["joint"], + config_dict["control"]["damping"]["joint"], + )) + # rospy.loginfo("[Env] motor strength: {}".format(unitree_real_env.motor_strength)) + + if args.mode == "jetson": + embeding_publisher = rospy.Publisher( + args.namespace + "/visual_embedding", + Float32MultiArray, + queue_size= 1, + ) + # extract and build the torch ScriptFunction + visual_encoder = model.visual_encoder + visual_encoder = torch.jit.script(visual_encoder) + + forward_depth_subscriber = rospy.Subscriber( + args.namespace + "/camera/depth/image_rect_raw", + Image, + partial(handle_forward_depth, + model= visual_encoder, + publisher= embeding_publisher, + output_resolution= config_dict["sensor"]["forward_camera"].get( + "output_resolution", + config_dict["sensor"]["forward_camera"]["resolution"], + ), + device= model_device, + ), + queue_size= 1, + ) + rospy.spin() + elif args.mode == "upboard": + # extract and build the torch ScriptFunction + memory_module = model.memory_a + actor_mlp = model.actor + @torch.jit.script + def policy(obs): + recurrent_embedding = memory_module(obs) + actions = actor_mlp(recurrent_embedding.squeeze(0)) + return actions + + walk_policy, walk_model = load_walk_policy(unitree_real_env, args.walkdir) + + using_walk_policy = True # switch between skill policy and walk policy + unitree_real_env.start_ros() + unitree_real_env.wait_untill_ros_working() + rate = rospy.Rate(1 / duration) + with torch.no_grad(): + if not args.debug: + standup_procedure(unitree_real_env, rate, + angle_tolerance= 0.2, + kp= 40, + kd= 0.5, + warmup_timesteps= 50, + device= model_device, + ) + while not rospy.is_shutdown(): + # inference_start_time = rospy.get_time() + # check remote controller and decide which policy to use + if unitree_real_env.is_skill_mode(): + if using_walk_policy: + rospy.loginfo_throttle(0.1, "switch to skill policy") + using_walk_policy = False + model.reset() + else: + if not using_walk_policy: + rospy.loginfo_throttle(0.1, "switch to walk policy") + using_walk_policy = True + walk_model.reset() + if not using_walk_policy: + obs = unitree_real_env.get_obs() + actions = policy(obs) + else: + walk_obs = unitree_real_env._get_proprioception_obs() + actions = walk_policy(walk_obs) + unitree_real_env.send_action(actions) + # unitree_real_env.send_action(torch.zeros((1, 12))) + # inference_duration = rospy.get_time() - inference_start_time + # rospy.loginfo("inference duration: {:.3f}".format(inference_duration)) + # rospy.loginfo("visual_latency: %f", rospy.get_time() - unitree_real_env.forward_depth_embedding_stamp.to_sec()) + # motor_temperatures = [motor_state.temperature for motor_state in unitree_real_env.low_state_buffer.motorState] + # rospy.loginfo_throttle(10, " ".join(["motor_temperatures:"] + ["{:d},".format(t) for t in motor_temperatures[:12]])) + rate.sleep() + if unitree_real_env.low_state_buffer.wirelessRemote.btn.components.down: + rospy.loginfo_throttle(0.1, "model reset") + model.reset() + walk_model.reset() + if unitree_real_env.low_state_buffer.wirelessRemote.btn.components.L2 or unitree_real_env.low_state_buffer.wirelessRemote.btn.components.R2: + unitree_real_env.publish_legs_cmd(unitree_real_env.default_dof_pos.unsqueeze(0), kp= 2, kd= 0.5) + rospy.signal_shutdown("Controller send stop signal, exiting") + elif args.mode == "full": + # extract and build the torch ScriptFunction + visual_obs_slice = get_obs_slice(unitree_real_env.obs_segments, "forward_depth") + visual_encoder = model.visual_encoder + memory_module = model.memory_a + actor_mlp = model.actor + @torch.jit.script + def policy(observations: torch.Tensor, obs_start: int, obs_stop: int, obs_shape: Tuple[int, int, int]): + visual_latent = visual_encoder( + observations[..., obs_start:obs_stop].reshape(-1, *obs_shape) + ).reshape(1, -1) + obs = torch.cat([ + observations[..., :obs_start], + visual_latent, + observations[..., obs_stop:], + ], dim= -1) + recurrent_embedding = memory_module(obs) + actions = actor_mlp(recurrent_embedding.squeeze(0)) + return actions + + unitree_real_env.start_ros() + unitree_real_env.wait_untill_ros_working() + rate = rospy.Rate(1 / duration) + with torch.no_grad(): + while not rospy.is_shutdown(): + # inference_start_time = rospy.get_time() + obs = unitree_real_env.get_obs() + actions = policy(obs, + obs_start= visual_obs_slice[0].start.item(), + obs_stop= visual_obs_slice[0].stop.item(), + obs_shape= visual_obs_slice[1], + ) + unitree_real_env.send_action(actions) + # inference_duration = rospy.get_time() - inference_start_time + motor_temperatures = [motor_state.temperature for motor_state in unitree_real_env.low_state_buffer.motorState] + rospy.loginfo_throttle(10, " ".join(["motor_temperatures:"] + ["{:d},".format(t) for t in motor_temperatures[:12]])) + rate.sleep() + if unitree_real_env.low_state_buffer.wirelessRemote.btn.components.L2 or unitree_real_env.low_state_buffer.wirelessRemote.btn.components.R2: + unitree_real_env.publish_legs_cmd(unitree_real_env.default_dof_pos.unsqueeze(0), kp= 20, kd= 0.5) + rospy.signal_shutdown("Controller send stop signal, exiting") + else: + rospy.logfatal("Unknown mode, exiting") + +if __name__ == "__main__": + """ The script to run the A1 script in ROS. + It's designed as a main function and not designed to be a scalable code. + """ + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--namespace", + type= str, + default= "/a112138", + ) + parser.add_argument("--logdir", + type= str, + help= "The log directory of the trained model", + default= None, + ) + parser.add_argument("--walkdir", + type= str, + help= "The log directory of the walking model, not for the skills.", + default= None, + ) + parser.add_argument("--mode", + type= str, + help= "The mode to determine which computer to run on.", + choices= ["jetson", "upboard", "full"], + ) + parser.add_argument("--debug", + action= "store_true", + ) + + args = parser.parse_args() + main(args) \ No newline at end of file diff --git a/onboard_script/a1_visual_embedding.py b/onboard_script/a1_visual_embedding.py new file mode 100644 index 0000000..b838b8b --- /dev/null +++ b/onboard_script/a1_visual_embedding.py @@ -0,0 +1,317 @@ +import os +import os.path as osp +import numpy as np +import torch +import json +from functools import partial +from collections import OrderedDict + +from a1_real import UnitreeA1Real, resize2d +from rsl_rl import modules + +import rospy +from unitree_legged_msgs.msg import Float32MultiArrayStamped +from sensor_msgs.msg import Image +import ros_numpy + +import pyrealsense2 as rs + +def get_encoder_script(logdir): + with open(osp.join(logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + + model_device = torch.device("cuda") + + unitree_real_env = UnitreeA1Real( + robot_namespace= "a112138", + cfg= config_dict, + forward_depth_topic= "", # this env only computes parameters to build the model + forward_depth_embedding_dims= None, + model_device= model_device, + ) + + model = getattr(modules, config_dict["runner"]["policy_class_name"])( + num_actor_obs= unitree_real_env.num_obs, + num_critic_obs= unitree_real_env.num_privileged_obs, + num_actions= 12, + obs_segments= unitree_real_env.obs_segments, + privileged_obs_segments= unitree_real_env.privileged_obs_segments, + **config_dict["policy"], + ) + model_names = [i for i in os.listdir(logdir) if i.startswith("model_")] + model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0])) + state_dict = torch.load(osp.join(args.logdir, model_names[-1]), map_location= "cpu") + model.load_state_dict(state_dict["model_state_dict"]) + model.to(model_device) + model.eval() + + visual_encoder = model.visual_encoder + script = torch.jit.script(visual_encoder) + + return script, model_device + +def get_input_filter(args): + """ This is the filter different from the simulator, but try to close the gap. """ + with open(osp.join(args.logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + image_resolution = config_dict["sensor"]["forward_camera"].get( + "output_resolution", + config_dict["sensor"]["forward_camera"]["resolution"], + ) + depth_range = config_dict["sensor"]["forward_camera"].get( + "depth_range", + [0.0, 3.0], + ) + depth_range = (depth_range[0] * 1000, depth_range[1] * 1000) # [m] -> [mm] + crop_top, crop_bottom, crop_left, crop_right = args.crop_top, args.crop_bottom, args.crop_left, args.crop_right + crop_far = args.crop_far * 1000 + + def input_filter(depth_image: torch.Tensor, + crop_top: int, + crop_bottom: int, + crop_left: int, + crop_right: int, + crop_far: float, + depth_min: int, + depth_max: int, + output_height: int, + output_width: int, + ): + """ depth_image must have shape [1, 1, H, W] """ + depth_image = depth_image[:, :, + crop_top: -crop_bottom-1, + crop_left: -crop_right-1, + ] + depth_image[depth_image > crop_far] = depth_max + depth_image = torch.clip( + depth_image, + depth_min, + depth_max, + ) / (depth_max - depth_min) + depth_image = resize2d(depth_image, (output_height, output_width)) + return depth_image + # input_filter = torch.jit.script(input_filter) + + return partial(input_filter, + crop_top= crop_top, + crop_bottom= crop_bottom, + crop_left= crop_left, + crop_right= crop_right, + crop_far= crop_far, + depth_min= depth_range[0], + depth_max= depth_range[1], + output_height= image_resolution[0], + output_width= image_resolution[1], + ), depth_range + +def get_started_pipeline( + height= 480, + width= 640, + fps= 30, + enable_rgb= False, + ): + # By default, rgb is not used. + pipeline = rs.pipeline() + config = rs.config() + config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) + if enable_rgb: + config.enable_stream(rs.stream.color, width, height, rs.format.rgb8, fps) + profile = pipeline.start(config) + + # build the sensor filter + hole_filling_filter = rs.hole_filling_filter(2) + spatial_filter = rs.spatial_filter() + spatial_filter.set_option(rs.option.filter_magnitude, 5) + spatial_filter.set_option(rs.option.filter_smooth_alpha, 0.75) + spatial_filter.set_option(rs.option.filter_smooth_delta, 1) + spatial_filter.set_option(rs.option.holes_fill, 4) + temporal_filter = rs.temporal_filter() + temporal_filter.set_option(rs.option.filter_smooth_alpha, 0.75) + temporal_filter.set_option(rs.option.filter_smooth_delta, 1) + # decimation_filter = rs.decimation_filter() + # decimation_filter.set_option(rs.option.filter_magnitude, 2) + + def filter_func(frame): + frame = hole_filling_filter.process(frame) + frame = spatial_filter.process(frame) + frame = temporal_filter.process(frame) + # frame = decimation_filter.process(frame) + return frame + + return pipeline, filter_func + +def main(args): + rospy.init_node("a1_legged_gym_jetson") + + input_filter, depth_range = get_input_filter(args) + model_script, model_device = get_encoder_script(args.logdir) + with open(osp.join(args.logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + if config_dict.get("sensor", dict()).get("forward_camera", dict()).get("refresh_duration", None) is not None: + refresh_duration = config_dict["sensor"]["forward_camera"]["refresh_duration"] + ros_rate = rospy.Rate(1.0 / refresh_duration) + rospy.loginfo("Using refresh duration {}s".format(refresh_duration)) + else: + ros_rate = rospy.Rate(args.fps) + + rs_pipeline, rs_filters = get_started_pipeline( + height= args.height, + width= args.width, + fps= args.fps, + enable_rgb= args.enable_rgb, + ) + + # gyro_pipeline = rs.pipeline() + # gyro_config = rs.config() + # gyro_config.enable_stream(rs.stream.gyro, rs.format.motion_xyz32f, 200) + # gyro_profile = gyro_pipeline.start(gyro_config) + + embedding_publisher = rospy.Publisher( + args.namespace + "/visual_embedding", + Float32MultiArrayStamped, + queue_size= 1, + ) + + if args.enable_vis: + depth_image_publisher = rospy.Publisher( + args.namespace + "/camera/depth/image_rect_raw", + Image, + queue_size= 1, + ) + network_input_publisher = rospy.Publisher( + args.namespace + "/camera/depth/network_input_raw", + Image, + queue_size= 1, + ) + if args.enable_rgb: + rgb_image_publisher = rospy.Publisher( + args.namespace + "/camera/color/image_raw", + Image, + queue_size= 1, + ) + + rospy.loginfo("Depth range is clipped to [{}, {}] and normalized".format(depth_range[0], depth_range[1])) + rospy.loginfo("ROS, model, realsense have been initialized.") + if args.enable_vis: + rospy.loginfo("Visualization enabled, sending depth{} images".format(", rgb" if args.enable_rgb else "")) + try: + embedding_msg = Float32MultiArrayStamped() + embedding_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame" + frame_got = False + while not rospy.is_shutdown(): + # Wait for the depth image + frames = rs_pipeline.wait_for_frames(int( \ + config_dict["sensor"]["forward_camera"]["latency_range"][1] \ + * 1000)) # ms + embedding_msg.header.stamp = rospy.Time.now() + depth_frame = frames.get_depth_frame() + if not depth_frame: + continue + if not frame_got: + frame_got = True + rospy.loginfo("Realsense frame recieved. Sending embeddings...") + if args.enable_rgb: + color_frame = frames.get_color_frame() + # Use this branch to log the time when image is acquired + if args.enable_vis and not color_frame is None: + color_frame = np.asanyarray(color_frame.get_data()) + rgb_image_msg = ros_numpy.msgify(Image, color_frame, encoding= "rgb8") + rgb_image_msg.header.stamp = rospy.Time.now() + rgb_image_msg.header.frame_id = args.namespace + "/camera_color_optical_frame" + rgb_image_publisher.publish(rgb_image_msg) + + # Process the depth image and publish + depth_frame = rs_filters(depth_frame) + depth_image_ = np.asanyarray(depth_frame.get_data()) + depth_image = torch.from_numpy(depth_image_.astype(np.float32)).unsqueeze(0).unsqueeze(0).to(model_device) + depth_image = input_filter(depth_image) + with torch.no_grad(): + depth_embedding = model_script(depth_image).reshape(-1).cpu().numpy() + embedding_msg.header.seq += 1 + embedding_msg.data = depth_embedding.tolist() + embedding_publisher.publish(embedding_msg) + + # Publish the acquired image if needed + if args.enable_vis: + depth_image_msg = ros_numpy.msgify(Image, depth_image_, encoding= "16UC1") + depth_image_msg.header.stamp = rospy.Time.now() + depth_image_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame" + depth_image_publisher.publish(depth_image_msg) + network_input_np = (\ + depth_image.detach().cpu().numpy()[0, 0] * (depth_range[1] - depth_range[0]) \ + + depth_range[0] + ).astype(np.uint16) + network_input_msg = ros_numpy.msgify(Image, network_input_np, encoding= "16UC1") + network_input_msg.header.stamp = rospy.Time.now() + network_input_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame" + network_input_publisher.publish(network_input_msg) + + ros_rate.sleep() + finally: + rs_pipeline.stop() + +if __name__ == "__main__": + """ This script is designed to load the model and process the realsense image directly + from realsense SDK without realsense ROS wrapper + """ + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--namespace", + type= str, + default= "/a112138", + ) + parser.add_argument("--logdir", + type= str, + help= "The log directory of the trained model", + ) + parser.add_argument("--height", + type= int, + default= 240, + help= "The height of the realsense image", + ) + parser.add_argument("--width", + type= int, + default= 424, + help= "The width of the realsense image", + ) + parser.add_argument("--fps", + type= int, + default= 30, + help= "The fps of the realsense image", + ) + parser.add_argument("--crop_left", + type= int, + default= 60, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_right", + type= int, + default= 46, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_top", + type= int, + default= 0, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_bottom", + type= int, + default= 0, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_far", + type= float, + default= 3.0, + help= "asside from the config far limit, make all depth readings larger than this value to be 3.0 in un-normalized network input." + ) + parser.add_argument("--enable_rgb", + action= "store_true", + help= "Whether to enable rgb image", + ) + parser.add_argument("--enable_vis", + action= "store_true", + help= "Whether to publish realsense image", + ) + + args = parser.parse_args() + main(args) diff --git a/onboard_script/go1_visual_embedding.py b/onboard_script/go1_visual_embedding.py new file mode 100644 index 0000000..3043d16 --- /dev/null +++ b/onboard_script/go1_visual_embedding.py @@ -0,0 +1,317 @@ +import os +import os.path as osp +import numpy as np +import torch +import json +from functools import partial +from collections import OrderedDict + +from a1_real import UnitreeA1Real, resize2d +from rsl_rl import modules + +import rospy +from unitree_legged_msgs.msg import Float32MultiArrayStamped +from sensor_msgs.msg import Image +import ros_numpy + +import pyrealsense2 as rs + +def get_encoder_script(logdir): + with open(osp.join(logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + + model_device = torch.device("cuda") + + unitree_real_env = UnitreeA1Real( + robot_namespace= "a112138", + cfg= config_dict, + forward_depth_topic= "", # this env only computes parameters to build the model + forward_depth_embedding_dims= None, + model_device= model_device, + ) + + model = getattr(modules, config_dict["runner"]["policy_class_name"])( + num_actor_obs= unitree_real_env.num_obs, + num_critic_obs= unitree_real_env.num_privileged_obs, + num_actions= 12, + obs_segments= unitree_real_env.obs_segments, + privileged_obs_segments= unitree_real_env.privileged_obs_segments, + **config_dict["policy"], + ) + model_names = [i for i in os.listdir(logdir) if i.startswith("model_")] + model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0])) + state_dict = torch.load(osp.join(args.logdir, model_names[-1]), map_location= "cpu") + model.load_state_dict(state_dict["model_state_dict"]) + model.to(model_device) + model.eval() + + visual_encoder = model.visual_encoder + script = torch.jit.script(visual_encoder) + + return script, model_device + +def get_input_filter(args): + """ This is the filter different from the simulator, but try to close the gap. """ + with open(osp.join(args.logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + image_resolution = config_dict["sensor"]["forward_camera"].get( + "output_resolution", + config_dict["sensor"]["forward_camera"]["resolution"], + ) + depth_range = config_dict["sensor"]["forward_camera"].get( + "depth_range", + [0.0, 3.0], + ) + depth_range = (depth_range[0] * 1000, depth_range[1] * 1000) # [m] -> [mm] + crop_top, crop_bottom, crop_left, crop_right = args.crop_top, args.crop_bottom, args.crop_left, args.crop_right + crop_far = args.crop_far * 1000 + + def input_filter(depth_image: torch.Tensor, + crop_top: int, + crop_bottom: int, + crop_left: int, + crop_right: int, + crop_far: float, + depth_min: int, + depth_max: int, + output_height: int, + output_width: int, + ): + """ depth_image must have shape [1, 1, H, W] """ + depth_image = depth_image[:, :, + crop_top: -crop_bottom-1, + crop_left: -crop_right-1, + ] + depth_image[depth_image > crop_far] = depth_max + depth_image = torch.clip( + depth_image, + depth_min, + depth_max, + ) / (depth_max - depth_min) + depth_image = resize2d(depth_image, (output_height, output_width)) + return depth_image + # input_filter = torch.jit.script(input_filter) + + return partial(input_filter, + crop_top= crop_top, + crop_bottom= crop_bottom, + crop_left= crop_left, + crop_right= crop_right, + crop_far= crop_far, + depth_min= depth_range[0], + depth_max= depth_range[1], + output_height= image_resolution[0], + output_width= image_resolution[1], + ), depth_range + +def get_started_pipeline( + height= 480, + width= 640, + fps= 30, + enable_rgb= False, + ): + # By default, rgb is not used. + pipeline = rs.pipeline() + config = rs.config() + config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) + if enable_rgb: + config.enable_stream(rs.stream.color, width, height, rs.format.rgb8, fps) + profile = pipeline.start(config) + + # build the sensor filter + hole_filling_filter = rs.hole_filling_filter(2) + spatial_filter = rs.spatial_filter() + spatial_filter.set_option(rs.option.filter_magnitude, 5) + spatial_filter.set_option(rs.option.filter_smooth_alpha, 0.75) + spatial_filter.set_option(rs.option.filter_smooth_delta, 1) + spatial_filter.set_option(rs.option.holes_fill, 4) + temporal_filter = rs.temporal_filter() + temporal_filter.set_option(rs.option.filter_smooth_alpha, 0.75) + temporal_filter.set_option(rs.option.filter_smooth_delta, 1) + # decimation_filter = rs.decimation_filter() + # decimation_filter.set_option(rs.option.filter_magnitude, 2) + + def filter_func(frame): + frame = hole_filling_filter.process(frame) + frame = spatial_filter.process(frame) + frame = temporal_filter.process(frame) + # frame = decimation_filter.process(frame) + return frame + + return pipeline, filter_func + +def main(args): + rospy.init_node("a1_legged_gym_jetson") + + input_filter, depth_range = get_input_filter(args) + model_script, model_device = get_encoder_script(args.logdir) + with open(osp.join(args.logdir, "config.json"), "r") as f: + config_dict = json.load(f, object_pairs_hook= OrderedDict) + if config_dict.get("sensor", dict()).get("forward_camera", dict()).get("refresh_duration", None) is not None: + refresh_duration = config_dict["sensor"]["forward_camera"]["refresh_duration"] + ros_rate = rospy.Rate(1.0 / refresh_duration) + rospy.loginfo("Using refresh duration {}s".format(refresh_duration)) + else: + ros_rate = rospy.Rate(args.fps) + + rs_pipeline, rs_filters = get_started_pipeline( + height= args.height, + width= args.width, + fps= args.fps, + enable_rgb= args.enable_rgb, + ) + + # gyro_pipeline = rs.pipeline() + # gyro_config = rs.config() + # gyro_config.enable_stream(rs.stream.gyro, rs.format.motion_xyz32f, 200) + # gyro_profile = gyro_pipeline.start(gyro_config) + + embedding_publisher = rospy.Publisher( + args.namespace + "/visual_embedding", + Float32MultiArrayStamped, + queue_size= 1, + ) + + if args.enable_vis: + depth_image_publisher = rospy.Publisher( + args.namespace + "/camera/depth/image_rect_raw", + Image, + queue_size= 1, + ) + network_input_publisher = rospy.Publisher( + args.namespace + "/camera/depth/network_input_raw", + Image, + queue_size= 1, + ) + if args.enable_rgb: + rgb_image_publisher = rospy.Publisher( + args.namespace + "/camera/color/image_raw", + Image, + queue_size= 1, + ) + + rospy.loginfo("Depth range is clipped to [{}, {}] and normalized".format(depth_range[0], depth_range[1])) + rospy.loginfo("ROS, model, realsense have been initialized.") + if args.enable_vis: + rospy.loginfo("Visualization enabled, sending depth{} images".format(", rgb" if args.enable_rgb else "")) + try: + embedding_msg = Float32MultiArrayStamped() + embedding_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame" + frame_got = False + while not rospy.is_shutdown(): + # Wait for the depth image + frames = rs_pipeline.wait_for_frames(int( \ + config_dict["sensor"]["forward_camera"]["latency_range"][1] \ + * 1000)) # ms + embedding_msg.header.stamp = rospy.Time.now() + depth_frame = frames.get_depth_frame() + if not depth_frame: + continue + if not frame_got: + frame_got = True + rospy.loginfo("Realsense frame recieved. Sending embeddings...") + if args.enable_rgb: + color_frame = frames.get_color_frame() + # Use this branch to log the time when image is acquired + if args.enable_vis and not color_frame is None: + color_frame = np.asanyarray(color_frame.get_data()) + rgb_image_msg = ros_numpy.msgify(Image, color_frame, encoding= "rgb8") + rgb_image_msg.header.stamp = rospy.Time.now() + rgb_image_msg.header.frame_id = args.namespace + "/camera_color_optical_frame" + rgb_image_publisher.publish(rgb_image_msg) + + # Process the depth image and publish + depth_frame = rs_filters(depth_frame) + depth_image_ = np.asanyarray(depth_frame.get_data()) + depth_image = torch.from_numpy(depth_image_.astype(np.float32)).unsqueeze(0).unsqueeze(0).to(model_device) + depth_image = input_filter(depth_image) + with torch.no_grad(): + depth_embedding = model_script(depth_image).reshape(-1).cpu().numpy() + embedding_msg.header.seq += 1 + embedding_msg.data = depth_embedding.tolist() + embedding_publisher.publish(embedding_msg) + + # Publish the acquired image if needed + if args.enable_vis: + depth_image_msg = ros_numpy.msgify(Image, depth_image_, encoding= "16UC1") + depth_image_msg.header.stamp = rospy.Time.now() + depth_image_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame" + depth_image_publisher.publish(depth_image_msg) + network_input_np = (\ + depth_image.detach().cpu().numpy()[0, 0] * (depth_range[1] - depth_range[0]) \ + + depth_range[0] + ).astype(np.uint16) + network_input_msg = ros_numpy.msgify(Image, network_input_np, encoding= "16UC1") + network_input_msg.header.stamp = rospy.Time.now() + network_input_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame" + network_input_publisher.publish(network_input_msg) + + ros_rate.sleep() + finally: + rs_pipeline.stop() + +if __name__ == "__main__": + """ This script is designed to load the model and process the realsense image directly + from realsense SDK without realsense ROS wrapper + """ + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--namespace", + type= str, + default= "/a112138", + ) + parser.add_argument("--logdir", + type= str, + help= "The log directory of the trained model", + ) + parser.add_argument("--height", + type= int, + default= 270, + help= "The height of the realsense image", + ) + parser.add_argument("--width", + type= int, + default= 480, + help= "The width of the realsense image", + ) + parser.add_argument("--fps", + type= int, + default= 30, + help= "The fps of the realsense image", + ) + parser.add_argument("--crop_left", + type= int, + default= 60, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_right", + type= int, + default= 46, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_top", + type= int, + default= 0, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_bottom", + type= int, + default= 0, + help= "num of pixel to crop in the original pyrealsense readings." + ) + parser.add_argument("--crop_far", + type= float, + default= 3.0, + help= "asside from the config far limit, make all depth readings larger than this value to be 3.0 in un-normalized network input." + ) + parser.add_argument("--enable_rgb", + action= "store_true", + help= "Whether to enable rgb image", + ) + parser.add_argument("--enable_vis", + action= "store_true", + help= "Whether to publish realsense image", + ) + + args = parser.parse_args() + main(args) diff --git a/rsl_rl/rsl_rl/algorithms/tppo.py b/rsl_rl/rsl_rl/algorithms/tppo.py index bad18a3..ed53c5b 100644 --- a/rsl_rl/rsl_rl/algorithms/tppo.py +++ b/rsl_rl/rsl_rl/algorithms/tppo.py @@ -164,6 +164,12 @@ class TPPO(PPO): self.actor_critic.action_mean - minibatch.action_labels, dim= -1 ) + elif self.distill_target == "l1": + dist_loss = torch.norm( + self.actor_critic.action_mean - minibatch.action_labels, + dim= -1, + p= 1, + ) elif self.distill_target == "tanh": # for tanh, similar to loss function for sigmoid, refer to https://stats.stackexchange.com/questions/12754/matching-loss-function-for-tanh-units-in-a-neural-net dist_loss = F.binary_cross_entropy( diff --git a/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py b/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py index 550760e..e5c16f9 100644 --- a/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py +++ b/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py @@ -15,6 +15,8 @@ class ActorCriticFieldMutex(ActorCriticMutex): def __init__(self, *args, cmd_vel_mapping = dict(), + reset_non_selected = "all", + action_smoothing_buffer_len = 1, **kwargs, ): """ NOTE: This implementation only supports subpolicy output to (-1., 1.) range. @@ -24,6 +26,9 @@ class ActorCriticFieldMutex(ActorCriticMutex): """ super().__init__(*args, **kwargs) self.cmd_vel_mapping = cmd_vel_mapping + self.reset_non_selected = reset_non_selected + self.action_smoothing_buffer_len = action_smoothing_buffer_len + self.action_smoothing_buffer = None # load cmd_scale to assign the cmd_vel during overriding self.cmd_scales = [] @@ -101,18 +106,33 @@ class ActorCriticFieldMutex(ActorCriticMutex): def act_inference(self, observations): # run entire batch for each sub policy in case the batch size and length problem. policy_selection = self.get_policy_selection(observations) + if self.action_smoothing_buffer is None: + self.action_smoothing_buffer = torch.zeros( + self.action_smoothing_buffer_len, + *policy_selection.shape, + device= policy_selection.device, + dtype= torch.float, + ) # (len, N, ..., selection) + self.action_smoothing_buffer = torch.cat([ + self.action_smoothing_buffer[1:], + policy_selection.unsqueeze(0), + ], dim= 0) # put the new one at the end observations = self.recover_last_action(observations, policy_selection) if self.cmd_vel_mapping: observations = self.override_cmd_vel(observations, policy_selection) outputs = [p.act_inference(observations) for p in self.submodules] - output = torch.empty_like(outputs[0]) + output = torch.zeros_like(outputs[0]) for idx, out in enumerate(outputs): - output[policy_selection[..., idx]] = torch.clip( - out[policy_selection[..., idx]] * getattr(self, "subpolicy_action_scale_{:d}".format(idx)) / self.env_action_scale, - -1., 1., - ) + output += out * getattr(self, "subpolicy_action_scale_{:d}".format(idx)) / self.env_action_scale \ + * self.action_smoothing_buffer[..., idx].mean(dim= 0).unsqueeze(-1) # choose one or none reset method - self.submodules[idx].reset(~policy_selection[..., idx]) + if self.reset_non_selected == "all" or self.reset_non_selected == True: + self.submodules[idx].reset(self.action_smoothing_buffer[..., idx].sum(0) == 0) + elif self.reset_non_selected == "when_skill" and idx > 0: + self.submodules[idx].reset(torch.logical_and( + ~policy_selection[..., idx], + ~policy_selection[..., 0], + )) # self.submodules[idx].reset(torch.ones(observations.shape[0], dtype= bool, device= observations.device)) return output @@ -122,16 +142,18 @@ class ActorCriticFieldMutex(ActorCriticMutex): return super().reset(dones) class ActorCriticClimbMutex(ActorCriticFieldMutex): - """ A variant to handle climb-up and climb-down with seperate policies - Climb-down policy will be the last submodule in the list + """ A variant to handle jump-up and jump-down with seperate policies + Jump-down policy will be the last submodule in the list """ JUMP_OBSTACLE_ID = 3 # starting from 0, referring to barrker_track.py:BarrierTrack.track_options_id_dict def __init__(self, *args, sub_policy_paths: list = None, - climb_down_policy_path: str = None, + jump_down_policy_path: str = None, + jump_down_vel: float = None, # can be tuple/list, use it to stop using jump up velocity command **kwargs,): - sub_policy_paths = sub_policy_paths + [climb_down_policy_path] + sub_policy_paths = sub_policy_paths + [jump_down_policy_path] + self.jump_down_vel = jump_down_vel super().__init__( *args, sub_policy_paths= sub_policy_paths, @@ -140,23 +162,28 @@ class ActorCriticClimbMutex(ActorCriticFieldMutex): def resample_cmd_vel_current(self, dones=None): return_ = super().resample_cmd_vel_current(dones) - self.cmd_vel_current[len(self.submodules) - 1] = self.cmd_vel_current[self.JUMP_OBSTACLE_ID] + if self.jump_down_vel is None: + self.cmd_vel_current[len(self.submodules) - 1] = self.cmd_vel_current[self.JUMP_OBSTACLE_ID] + elif isinstance(self.jump_down_vel, (tuple, list)): + self.cmd_vel_current[len(self.submodules) - 1] = np.random.uniform(*self.jump_down_vel) + else: + self.cmd_vel_current[len(self.submodules) - 1] = self.jump_down_vel return return_ def get_policy_selection(self, observations): obstacle_id_onehot = super().get_policy_selection(observations) obs_slice = get_obs_slice(self.obs_segments, "engaging_block") engaging_block_obs = observations[..., obs_slice[0]].reshape(*observations.shape[:-1], *obs_slice[1]) - climb_up_mask = engaging_block_obs[..., -1] > 0 # climb-up or climb-down + jump_up_mask = engaging_block_obs[..., -1] > 0 # jump-up or jump-down obstacle_id_onehot = torch.cat([ obstacle_id_onehot, torch.logical_and( obstacle_id_onehot[..., self.JUMP_OBSTACLE_ID], - torch.logical_not(climb_up_mask), + torch.logical_not(jump_up_mask), ).unsqueeze(-1) ], dim= -1) obstacle_id_onehot[..., self.JUMP_OBSTACLE_ID] = torch.logical_and( obstacle_id_onehot[..., self.JUMP_OBSTACLE_ID], - climb_up_mask, + jump_up_mask, ) return obstacle_id_onehot.to(torch.bool) # (N, ..., selection) diff --git a/rsl_rl/rsl_rl/runners/on_policy_runner.py b/rsl_rl/rsl_rl/runners/on_policy_runner.py index 8ae84e6..7d9c043 100644 --- a/rsl_rl/rsl_rl/runners/on_policy_runner.py +++ b/rsl_rl/rsl_rl/runners/on_policy_runner.py @@ -76,6 +76,7 @@ class OnPolicyRunner: self.tot_timesteps = 0 self.tot_time = 0 self.current_learning_iteration = 0 + self.log_interval = self.cfg.get("log_interval", 1) _, _ = self.env.reset() @@ -130,7 +131,7 @@ class OnPolicyRunner: losses, stats = self.alg.update(self.current_learning_iteration) stop = time.time() learn_time = stop - start - if self.log_dir is not None: + if self.log_dir is not None and self.current_learning_iteration % self.log_interval == 0: self.log(locals()) if self.current_learning_iteration % self.save_interval == 0 and self.current_learning_iteration > start_iter: self.save(os.path.join(self.log_dir, 'model_{}.pt'.format(self.current_learning_iteration))) @@ -238,7 +239,7 @@ class OnPolicyRunner: def load(self, path, load_optimizer=True): loaded_dict = torch.load(path) self.alg.actor_critic.load_state_dict(loaded_dict['model_state_dict']) - if load_optimizer: + if load_optimizer and "optimizer_state_dict" in loaded_dict: self.alg.optimizer.load_state_dict(loaded_dict['optimizer_state_dict']) if "lr_scheduler_state_dict" in loaded_dict: if not hasattr(self.alg, "lr_scheduler"): diff --git a/rsl_rl/rsl_rl/runners/two_stage_runner.py b/rsl_rl/rsl_rl/runners/two_stage_runner.py index 1629dac..0333fbd 100644 --- a/rsl_rl/rsl_rl/runners/two_stage_runner.py +++ b/rsl_rl/rsl_rl/runners/two_stage_runner.py @@ -12,6 +12,7 @@ class TwoStageRunner(OnPolicyRunner): # load some configs and their default values self.pretrain_iterations = self.cfg.get("pretrain_iterations", 0) + self.log_interval = self.cfg.get("log_interval", 50) assert "pretrain_dataset" in self.cfg, "pretrain_dataset is not defined in the runner cfg object" self.rollout_dataset = RolloutDataset( **self.cfg["pretrain_dataset"],