diff --git a/iges/trimmed-patch-cube/README.md b/iges/trimmed-patch-cube/README.md new file mode 100644 index 0000000..a1f1c00 --- /dev/null +++ b/iges/trimmed-patch-cube/README.md @@ -0,0 +1,46 @@ +# trimmed-patch-cube + +A closed 100 mm cube given only as trimmed surfaces: 54 B-spline patches, nine per side, each +trimmed by a composite curve. Some trims have pieces written end to start, and some pieces stop +0.02 mm short of the next. + +- **File:** `trimmed-patch-cube.igs` +- **Author:** raykholo +- **Made with:** `scripts/generators/trimmed_patch_cube.py` (Python 3, standard library only; + shared code in `scripts/generators/prism.py`). It writes IGES 5.3 directly, in millimetres. Run + `python3 scripts/generators/trimmed_patch_cube.py iges/trimmed-patch-cube` to reproduce the file + byte for byte. +- **Content:** trimmed surfaces only, no solids. Entities: 54 trimmed surfaces (144), 54 rational + B-spline surfaces (128, bilinear patches), 54 curves on surface (142, model-space curve only), + 54 composite curves (102), 108 lines (110) and 108 B-spline curves (126, degree 1). +- **Size:** 54 faces, which sew into one closed shell with 108 edges and 56 vertices. 1,539 + lines, 125 KB. +- **SHA-256:** `8911254f16a31835597448f2420f9a604defb151e32e947c7dd901adc7dd3da8` + +## Shape + +Each side of the cube is split into 3 × 3 square patches, 33.3 mm across. Each patch is a degree +1 × 1 B-spline surface whose normal points out of the cube, trimmed by a curve on surface whose +model-space curve is a composite of four straight pieces round the patch, alternately lines and +degree-1 B-spline curves. Of the 216 pieces: + +- 43 are written end to start (their direction runs against the loop); in 10 trims that is the + first piece; +- 36 stop 0.02 mm before the corner where the next piece starts, so the loop has a gap there. + +## Why it is interesting + +A reader must turn each composite curve into a closed trim loop, then sew 54 separate faces into +one closed shell to get a solid. Readers that take pieces in the direction they are written, or +that need every piece to meet the next exactly, leave faces out, and the cube does not close. +The defects are mixed on purpose; each one alone is enough to drop faces. + +## Check values + +| | | +|---|---| +| Faces | 54 | +| Sewn result | 1 closed solid | +| Volume | 1,000,000 mm³ | +| Area | 60,000 mm² | +| Bounding box | x 0 … 100, y 0 … 100, z 0 … 100 mm | diff --git a/iges/trimmed-patch-cube/trimmed-patch-cube.igs b/iges/trimmed-patch-cube/trimmed-patch-cube.igs new file mode 100644 index 0000000..fe9a3f5 --- /dev/null +++ b/iges/trimmed-patch-cube/trimmed-patch-cube.igs @@ -0,0 +1,1539 @@ +Generated by scripts/generators (github.com/tangency-labs/models), CC0 S 1 +1H,,1H;,30Htangency-labs/models generator,22Htrimmed-patch-cube.igs, G 1 +26Hpython3 scripts/generators,17Hprism.py IGES 5.3,32,38,6,308,15, G 2 +22Htrimmed-patch-cube.igs,1.,2,2HMM,1,1.,15H20261020.000000,1.E-06, G 3 +100.0,8Hraykholo,0H,11,0,15H20261020.000000; G 4 + 128 1 0 0 0 0 0 000010000D 1 + 128 0 0 3 0 0D 2 + 110 4 0 0 0 0 0 000010000D 3 + 110 0 0 1 0 0D 4 + 126 5 0 0 0 0 0 000010000D 5 + 126 0 0 2 0 0D 6 + 110 7 0 0 0 0 0 000010000D 7 + 110 0 0 1 0 0D 8 + 126 8 0 0 0 0 0 000010000D 9 + 126 0 0 2 0 0D 10 + 102 10 0 0 0 0 0 000010000D 11 + 102 0 0 1 0 0D 12 + 142 11 0 0 0 0 0 000010000D 13 + 142 0 0 1 0 0D 14 + 144 12 0 0 0 0 0 000000000D 15 + 144 0 0 1 0 S0P00 0D 16 + 128 13 0 0 0 0 0 000010000D 17 + 128 0 0 3 0 0D 18 + 126 16 0 0 0 0 0 000010000D 19 + 126 0 0 2 0 0D 20 + 110 18 0 0 0 0 0 000010000D 21 + 110 0 0 1 0 0D 22 + 126 19 0 0 0 0 0 000010000D 23 + 126 0 0 2 0 0D 24 + 110 21 0 0 0 0 0 000010000D 25 + 110 0 0 1 0 0D 26 + 102 22 0 0 0 0 0 000010000D 27 + 102 0 0 1 0 0D 28 + 142 23 0 0 0 0 0 000010000D 29 + 142 0 0 1 0 0D 30 + 144 24 0 0 0 0 0 000000000D 31 + 144 0 0 1 0 S0P01 0D 32 + 128 25 0 0 0 0 0 000010000D 33 + 128 0 0 3 0 0D 34 + 110 28 0 0 0 0 0 000010000D 35 + 110 0 0 1 0 0D 36 + 126 29 0 0 0 0 0 000010000D 37 + 126 0 0 2 0 0D 38 + 110 31 0 0 0 0 0 000010000D 39 + 110 0 0 1 0 0D 40 + 126 32 0 0 0 0 0 000010000D 41 + 126 0 0 2 0 0D 42 + 102 34 0 0 0 0 0 000010000D 43 + 102 0 0 1 0 0D 44 + 142 35 0 0 0 0 0 000010000D 45 + 142 0 0 1 0 0D 46 + 144 36 0 0 0 0 0 000000000D 47 + 144 0 0 1 0 S0P02 0D 48 + 128 37 0 0 0 0 0 000010000D 49 + 128 0 0 3 0 0D 50 + 126 40 0 0 0 0 0 000010000D 51 + 126 0 0 2 0 0D 52 + 110 42 0 0 0 0 0 000010000D 53 + 110 0 0 1 0 0D 54 + 126 43 0 0 0 0 0 000010000D 55 + 126 0 0 2 0 0D 56 + 110 45 0 0 0 0 0 000010000D 57 + 110 0 0 1 0 0D 58 + 102 46 0 0 0 0 0 000010000D 59 + 102 0 0 1 0 0D 60 + 142 47 0 0 0 0 0 000010000D 61 + 142 0 0 1 0 0D 62 + 144 48 0 0 0 0 0 000000000D 63 + 144 0 0 1 0 S0P10 0D 64 + 128 49 0 0 0 0 0 000010000D 65 + 128 0 0 4 0 0D 66 + 110 53 0 0 0 0 0 000010000D 67 + 110 0 0 1 0 0D 68 + 126 54 0 0 0 0 0 000010000D 69 + 126 0 0 2 0 0D 70 + 110 56 0 0 0 0 0 000010000D 71 + 110 0 0 1 0 0D 72 + 126 57 0 0 0 0 0 000010000D 73 + 126 0 0 2 0 0D 74 + 102 59 0 0 0 0 0 000010000D 75 + 102 0 0 1 0 0D 76 + 142 60 0 0 0 0 0 000010000D 77 + 142 0 0 1 0 0D 78 + 144 61 0 0 0 0 0 000000000D 79 + 144 0 0 1 0 S0P11 0D 80 + 128 62 0 0 0 0 0 000010000D 81 + 128 0 0 3 0 0D 82 + 126 65 0 0 0 0 0 000010000D 83 + 126 0 0 2 0 0D 84 + 110 67 0 0 0 0 0 000010000D 85 + 110 0 0 1 0 0D 86 + 126 68 0 0 0 0 0 000010000D 87 + 126 0 0 2 0 0D 88 + 110 70 0 0 0 0 0 000010000D 89 + 110 0 0 1 0 0D 90 + 102 71 0 0 0 0 0 000010000D 91 + 102 0 0 1 0 0D 92 + 142 72 0 0 0 0 0 000010000D 93 + 142 0 0 1 0 0D 94 + 144 73 0 0 0 0 0 000000000D 95 + 144 0 0 1 0 S0P12 0D 96 + 128 74 0 0 0 0 0 000010000D 97 + 128 0 0 3 0 0D 98 + 110 77 0 0 0 0 0 000010000D 99 + 110 0 0 1 0 0D 100 + 126 78 0 0 0 0 0 000010000D 101 + 126 0 0 2 0 0D 102 + 110 80 0 0 0 0 0 000010000D 103 + 110 0 0 1 0 0D 104 + 126 81 0 0 0 0 0 000010000D 105 + 126 0 0 2 0 0D 106 + 102 83 0 0 0 0 0 000010000D 107 + 102 0 0 1 0 0D 108 + 142 84 0 0 0 0 0 000010000D 109 + 142 0 0 1 0 0D 110 + 144 85 0 0 0 0 0 000000000D 111 + 144 0 0 1 0 S0P20 0D 112 + 128 86 0 0 0 0 0 000010000D 113 + 128 0 0 3 0 0D 114 + 126 89 0 0 0 0 0 000010000D 115 + 126 0 0 2 0 0D 116 + 110 91 0 0 0 0 0 000010000D 117 + 110 0 0 1 0 0D 118 + 126 92 0 0 0 0 0 000010000D 119 + 126 0 0 2 0 0D 120 + 110 94 0 0 0 0 0 000010000D 121 + 110 0 0 1 0 0D 122 + 102 95 0 0 0 0 0 000010000D 123 + 102 0 0 1 0 0D 124 + 142 96 0 0 0 0 0 000010000D 125 + 142 0 0 1 0 0D 126 + 144 97 0 0 0 0 0 000000000D 127 + 144 0 0 1 0 S0P21 0D 128 + 128 98 0 0 0 0 0 000010000D 129 + 128 0 0 3 0 0D 130 + 110 101 0 0 0 0 0 000010000D 131 + 110 0 0 1 0 0D 132 + 126 102 0 0 0 0 0 000010000D 133 + 126 0 0 2 0 0D 134 + 110 104 0 0 0 0 0 000010000D 135 + 110 0 0 1 0 0D 136 + 126 105 0 0 0 0 0 000010000D 137 + 126 0 0 2 0 0D 138 + 102 107 0 0 0 0 0 000010000D 139 + 102 0 0 1 0 0D 140 + 142 108 0 0 0 0 0 000010000D 141 + 142 0 0 1 0 0D 142 + 144 109 0 0 0 0 0 000000000D 143 + 144 0 0 1 0 S0P22 0D 144 + 128 110 0 0 0 0 0 000010000D 145 + 128 0 0 3 0 0D 146 + 126 113 0 0 0 0 0 000010000D 147 + 126 0 0 2 0 0D 148 + 110 115 0 0 0 0 0 000010000D 149 + 110 0 0 1 0 0D 150 + 126 116 0 0 0 0 0 000010000D 151 + 126 0 0 2 0 0D 152 + 110 118 0 0 0 0 0 000010000D 153 + 110 0 0 1 0 0D 154 + 102 119 0 0 0 0 0 000010000D 155 + 102 0 0 1 0 0D 156 + 142 120 0 0 0 0 0 000010000D 157 + 142 0 0 1 0 0D 158 + 144 121 0 0 0 0 0 000000000D 159 + 144 0 0 1 0 S1P00 0D 160 + 128 122 0 0 0 0 0 000010000D 161 + 128 0 0 3 0 0D 162 + 110 125 0 0 0 0 0 000010000D 163 + 110 0 0 1 0 0D 164 + 126 126 0 0 0 0 0 000010000D 165 + 126 0 0 2 0 0D 166 + 110 128 0 0 0 0 0 000010000D 167 + 110 0 0 1 0 0D 168 + 126 129 0 0 0 0 0 000010000D 169 + 126 0 0 2 0 0D 170 + 102 131 0 0 0 0 0 000010000D 171 + 102 0 0 1 0 0D 172 + 142 132 0 0 0 0 0 000010000D 173 + 142 0 0 1 0 0D 174 + 144 133 0 0 0 0 0 000000000D 175 + 144 0 0 1 0 S1P01 0D 176 + 128 134 0 0 0 0 0 000010000D 177 + 128 0 0 3 0 0D 178 + 126 137 0 0 0 0 0 000010000D 179 + 126 0 0 2 0 0D 180 + 110 139 0 0 0 0 0 000010000D 181 + 110 0 0 1 0 0D 182 + 126 140 0 0 0 0 0 000010000D 183 + 126 0 0 2 0 0D 184 + 110 142 0 0 0 0 0 000010000D 185 + 110 0 0 1 0 0D 186 + 102 143 0 0 0 0 0 000010000D 187 + 102 0 0 1 0 0D 188 + 142 144 0 0 0 0 0 000010000D 189 + 142 0 0 1 0 0D 190 + 144 145 0 0 0 0 0 000000000D 191 + 144 0 0 1 0 S1P02 0D 192 + 128 146 0 0 0 0 0 000010000D 193 + 128 0 0 3 0 0D 194 + 110 149 0 0 0 0 0 000010000D 195 + 110 0 0 1 0 0D 196 + 126 150 0 0 0 0 0 000010000D 197 + 126 0 0 2 0 0D 198 + 110 152 0 0 0 0 0 000010000D 199 + 110 0 0 2 0 0D 200 + 126 154 0 0 0 0 0 000010000D 201 + 126 0 0 2 0 0D 202 + 102 156 0 0 0 0 0 000010000D 203 + 102 0 0 1 0 0D 204 + 142 157 0 0 0 0 0 000010000D 205 + 142 0 0 1 0 0D 206 + 144 158 0 0 0 0 0 000000000D 207 + 144 0 0 1 0 S1P10 0D 208 + 128 159 0 0 0 0 0 000010000D 209 + 128 0 0 4 0 0D 210 + 126 163 0 0 0 0 0 000010000D 211 + 126 0 0 2 0 0D 212 + 110 165 0 0 0 0 0 000010000D 213 + 110 0 0 2 0 0D 214 + 126 167 0 0 0 0 0 000010000D 215 + 126 0 0 2 0 0D 216 + 110 169 0 0 0 0 0 000010000D 217 + 110 0 0 2 0 0D 218 + 102 171 0 0 0 0 0 000010000D 219 + 102 0 0 1 0 0D 220 + 142 172 0 0 0 0 0 000010000D 221 + 142 0 0 1 0 0D 222 + 144 173 0 0 0 0 0 000000000D 223 + 144 0 0 1 0 S1P11 0D 224 + 128 174 0 0 0 0 0 000010000D 225 + 128 0 0 3 0 0D 226 + 110 177 0 0 0 0 0 000010000D 227 + 110 0 0 2 0 0D 228 + 126 179 0 0 0 0 0 000010000D 229 + 126 0 0 2 0 0D 230 + 110 181 0 0 0 0 0 000010000D 231 + 110 0 0 1 0 0D 232 + 126 182 0 0 0 0 0 000010000D 233 + 126 0 0 2 0 0D 234 + 102 184 0 0 0 0 0 000010000D 235 + 102 0 0 1 0 0D 236 + 142 185 0 0 0 0 0 000010000D 237 + 142 0 0 1 0 0D 238 + 144 186 0 0 0 0 0 000000000D 239 + 144 0 0 1 0 S1P12 0D 240 + 128 187 0 0 0 0 0 000010000D 241 + 128 0 0 3 0 0D 242 + 126 190 0 0 0 0 0 000010000D 243 + 126 0 0 2 0 0D 244 + 110 192 0 0 0 0 0 000010000D 245 + 110 0 0 1 0 0D 246 + 126 193 0 0 0 0 0 000010000D 247 + 126 0 0 2 0 0D 248 + 110 195 0 0 0 0 0 000010000D 249 + 110 0 0 1 0 0D 250 + 102 196 0 0 0 0 0 000010000D 251 + 102 0 0 1 0 0D 252 + 142 197 0 0 0 0 0 000010000D 253 + 142 0 0 1 0 0D 254 + 144 198 0 0 0 0 0 000000000D 255 + 144 0 0 1 0 S1P20 0D 256 + 128 199 0 0 0 0 0 000010000D 257 + 128 0 0 4 0 0D 258 + 110 203 0 0 0 0 0 000010000D 259 + 110 0 0 1 0 0D 260 + 126 204 0 0 0 0 0 000010000D 261 + 126 0 0 2 0 0D 262 + 110 206 0 0 0 0 0 000010000D 263 + 110 0 0 1 0 0D 264 + 126 207 0 0 0 0 0 000010000D 265 + 126 0 0 2 0 0D 266 + 102 209 0 0 0 0 0 000010000D 267 + 102 0 0 1 0 0D 268 + 142 210 0 0 0 0 0 000010000D 269 + 142 0 0 1 0 0D 270 + 144 211 0 0 0 0 0 000000000D 271 + 144 0 0 1 0 S1P21 0D 272 + 128 212 0 0 0 0 0 000010000D 273 + 128 0 0 3 0 0D 274 + 126 215 0 0 0 0 0 000010000D 275 + 126 0 0 2 0 0D 276 + 110 217 0 0 0 0 0 000010000D 277 + 110 0 0 1 0 0D 278 + 126 218 0 0 0 0 0 000010000D 279 + 126 0 0 2 0 0D 280 + 110 220 0 0 0 0 0 000010000D 281 + 110 0 0 1 0 0D 282 + 102 221 0 0 0 0 0 000010000D 283 + 102 0 0 1 0 0D 284 + 142 222 0 0 0 0 0 000010000D 285 + 142 0 0 1 0 0D 286 + 144 223 0 0 0 0 0 000000000D 287 + 144 0 0 1 0 S1P22 0D 288 + 128 224 0 0 0 0 0 000010000D 289 + 128 0 0 3 0 0D 290 + 110 227 0 0 0 0 0 000010000D 291 + 110 0 0 1 0 0D 292 + 126 228 0 0 0 0 0 000010000D 293 + 126 0 0 2 0 0D 294 + 110 230 0 0 0 0 0 000010000D 295 + 110 0 0 1 0 0D 296 + 126 231 0 0 0 0 0 000010000D 297 + 126 0 0 2 0 0D 298 + 102 233 0 0 0 0 0 000010000D 299 + 102 0 0 1 0 0D 300 + 142 234 0 0 0 0 0 000010000D 301 + 142 0 0 1 0 0D 302 + 144 235 0 0 0 0 0 000000000D 303 + 144 0 0 1 0 S2P00 0D 304 + 128 236 0 0 0 0 0 000010000D 305 + 128 0 0 3 0 0D 306 + 126 239 0 0 0 0 0 000010000D 307 + 126 0 0 2 0 0D 308 + 110 241 0 0 0 0 0 000010000D 309 + 110 0 0 1 0 0D 310 + 126 242 0 0 0 0 0 000010000D 311 + 126 0 0 2 0 0D 312 + 110 244 0 0 0 0 0 000010000D 313 + 110 0 0 1 0 0D 314 + 102 245 0 0 0 0 0 000010000D 315 + 102 0 0 1 0 0D 316 + 142 246 0 0 0 0 0 000010000D 317 + 142 0 0 1 0 0D 318 + 144 247 0 0 0 0 0 000000000D 319 + 144 0 0 1 0 S2P01 0D 320 + 128 248 0 0 0 0 0 000010000D 321 + 128 0 0 3 0 0D 322 + 110 251 0 0 0 0 0 000010000D 323 + 110 0 0 1 0 0D 324 + 126 252 0 0 0 0 0 000010000D 325 + 126 0 0 2 0 0D 326 + 110 254 0 0 0 0 0 000010000D 327 + 110 0 0 1 0 0D 328 + 126 255 0 0 0 0 0 000010000D 329 + 126 0 0 2 0 0D 330 + 102 257 0 0 0 0 0 000010000D 331 + 102 0 0 1 0 0D 332 + 142 258 0 0 0 0 0 000010000D 333 + 142 0 0 1 0 0D 334 + 144 259 0 0 0 0 0 000000000D 335 + 144 0 0 1 0 S2P02 0D 336 + 128 260 0 0 0 0 0 000010000D 337 + 128 0 0 3 0 0D 338 + 126 263 0 0 0 0 0 000010000D 339 + 126 0 0 2 0 0D 340 + 110 265 0 0 0 0 0 000010000D 341 + 110 0 0 1 0 0D 342 + 126 266 0 0 0 0 0 000010000D 343 + 126 0 0 2 0 0D 344 + 110 268 0 0 0 0 0 000010000D 345 + 110 0 0 1 0 0D 346 + 102 269 0 0 0 0 0 000010000D 347 + 102 0 0 1 0 0D 348 + 142 270 0 0 0 0 0 000010000D 349 + 142 0 0 1 0 0D 350 + 144 271 0 0 0 0 0 000000000D 351 + 144 0 0 1 0 S2P10 0D 352 + 128 272 0 0 0 0 0 000010000D 353 + 128 0 0 4 0 0D 354 + 110 276 0 0 0 0 0 000010000D 355 + 110 0 0 1 0 0D 356 + 126 277 0 0 0 0 0 000010000D 357 + 126 0 0 2 0 0D 358 + 110 279 0 0 0 0 0 000010000D 359 + 110 0 0 1 0 0D 360 + 126 280 0 0 0 0 0 000010000D 361 + 126 0 0 2 0 0D 362 + 102 282 0 0 0 0 0 000010000D 363 + 102 0 0 1 0 0D 364 + 142 283 0 0 0 0 0 000010000D 365 + 142 0 0 1 0 0D 366 + 144 284 0 0 0 0 0 000000000D 367 + 144 0 0 1 0 S2P11 0D 368 + 128 285 0 0 0 0 0 000010000D 369 + 128 0 0 3 0 0D 370 + 126 288 0 0 0 0 0 000010000D 371 + 126 0 0 2 0 0D 372 + 110 290 0 0 0 0 0 000010000D 373 + 110 0 0 1 0 0D 374 + 126 291 0 0 0 0 0 000010000D 375 + 126 0 0 2 0 0D 376 + 110 293 0 0 0 0 0 000010000D 377 + 110 0 0 1 0 0D 378 + 102 294 0 0 0 0 0 000010000D 379 + 102 0 0 1 0 0D 380 + 142 295 0 0 0 0 0 000010000D 381 + 142 0 0 1 0 0D 382 + 144 296 0 0 0 0 0 000000000D 383 + 144 0 0 1 0 S2P12 0D 384 + 128 297 0 0 0 0 0 000010000D 385 + 128 0 0 3 0 0D 386 + 110 300 0 0 0 0 0 000010000D 387 + 110 0 0 1 0 0D 388 + 126 301 0 0 0 0 0 000010000D 389 + 126 0 0 2 0 0D 390 + 110 303 0 0 0 0 0 000010000D 391 + 110 0 0 1 0 0D 392 + 126 304 0 0 0 0 0 000010000D 393 + 126 0 0 2 0 0D 394 + 102 306 0 0 0 0 0 000010000D 395 + 102 0 0 1 0 0D 396 + 142 307 0 0 0 0 0 000010000D 397 + 142 0 0 1 0 0D 398 + 144 308 0 0 0 0 0 000000000D 399 + 144 0 0 1 0 S2P20 0D 400 + 128 309 0 0 0 0 0 000010000D 401 + 128 0 0 3 0 0D 402 + 126 312 0 0 0 0 0 000010000D 403 + 126 0 0 2 0 0D 404 + 110 314 0 0 0 0 0 000010000D 405 + 110 0 0 1 0 0D 406 + 126 315 0 0 0 0 0 000010000D 407 + 126 0 0 2 0 0D 408 + 110 317 0 0 0 0 0 000010000D 409 + 110 0 0 1 0 0D 410 + 102 318 0 0 0 0 0 000010000D 411 + 102 0 0 1 0 0D 412 + 142 319 0 0 0 0 0 000010000D 413 + 142 0 0 1 0 0D 414 + 144 320 0 0 0 0 0 000000000D 415 + 144 0 0 1 0 S2P21 0D 416 + 128 321 0 0 0 0 0 000010000D 417 + 128 0 0 3 0 0D 418 + 110 324 0 0 0 0 0 000010000D 419 + 110 0 0 1 0 0D 420 + 126 325 0 0 0 0 0 000010000D 421 + 126 0 0 2 0 0D 422 + 110 327 0 0 0 0 0 000010000D 423 + 110 0 0 1 0 0D 424 + 126 328 0 0 0 0 0 000010000D 425 + 126 0 0 2 0 0D 426 + 102 330 0 0 0 0 0 000010000D 427 + 102 0 0 1 0 0D 428 + 142 331 0 0 0 0 0 000010000D 429 + 142 0 0 1 0 0D 430 + 144 332 0 0 0 0 0 000000000D 431 + 144 0 0 1 0 S2P22 0D 432 + 128 333 0 0 0 0 0 000010000D 433 + 128 0 0 3 0 0D 434 + 126 336 0 0 0 0 0 000010000D 435 + 126 0 0 2 0 0D 436 + 110 338 0 0 0 0 0 000010000D 437 + 110 0 0 1 0 0D 438 + 126 339 0 0 0 0 0 000010000D 439 + 126 0 0 2 0 0D 440 + 110 341 0 0 0 0 0 000010000D 441 + 110 0 0 1 0 0D 442 + 102 342 0 0 0 0 0 000010000D 443 + 102 0 0 1 0 0D 444 + 142 343 0 0 0 0 0 000010000D 445 + 142 0 0 1 0 0D 446 + 144 344 0 0 0 0 0 000000000D 447 + 144 0 0 1 0 S3P00 0D 448 + 128 345 0 0 0 0 0 000010000D 449 + 128 0 0 4 0 0D 450 + 110 349 0 0 0 0 0 000010000D 451 + 110 0 0 1 0 0D 452 + 126 350 0 0 0 0 0 000010000D 453 + 126 0 0 2 0 0D 454 + 110 352 0 0 0 0 0 000010000D 455 + 110 0 0 1 0 0D 456 + 126 353 0 0 0 0 0 000010000D 457 + 126 0 0 2 0 0D 458 + 102 355 0 0 0 0 0 000010000D 459 + 102 0 0 1 0 0D 460 + 142 356 0 0 0 0 0 000010000D 461 + 142 0 0 1 0 0D 462 + 144 357 0 0 0 0 0 000000000D 463 + 144 0 0 1 0 S3P01 0D 464 + 128 358 0 0 0 0 0 000010000D 465 + 128 0 0 3 0 0D 466 + 126 361 0 0 0 0 0 000010000D 467 + 126 0 0 2 0 0D 468 + 110 363 0 0 0 0 0 000010000D 469 + 110 0 0 1 0 0D 470 + 126 364 0 0 0 0 0 000010000D 471 + 126 0 0 2 0 0D 472 + 110 366 0 0 0 0 0 000010000D 473 + 110 0 0 1 0 0D 474 + 102 367 0 0 0 0 0 000010000D 475 + 102 0 0 1 0 0D 476 + 142 368 0 0 0 0 0 000010000D 477 + 142 0 0 1 0 0D 478 + 144 369 0 0 0 0 0 000000000D 479 + 144 0 0 1 0 S3P02 0D 480 + 128 370 0 0 0 0 0 000010000D 481 + 128 0 0 3 0 0D 482 + 110 373 0 0 0 0 0 000010000D 483 + 110 0 0 1 0 0D 484 + 126 374 0 0 0 0 0 000010000D 485 + 126 0 0 2 0 0D 486 + 110 376 0 0 0 0 0 000010000D 487 + 110 0 0 2 0 0D 488 + 126 378 0 0 0 0 0 000010000D 489 + 126 0 0 2 0 0D 490 + 102 380 0 0 0 0 0 000010000D 491 + 102 0 0 1 0 0D 492 + 142 381 0 0 0 0 0 000010000D 493 + 142 0 0 1 0 0D 494 + 144 382 0 0 0 0 0 000000000D 495 + 144 0 0 1 0 S3P10 0D 496 + 128 383 0 0 0 0 0 000010000D 497 + 128 0 0 4 0 0D 498 + 126 387 0 0 0 0 0 000010000D 499 + 126 0 0 2 0 0D 500 + 110 389 0 0 0 0 0 000010000D 501 + 110 0 0 2 0 0D 502 + 126 391 0 0 0 0 0 000010000D 503 + 126 0 0 2 0 0D 504 + 110 393 0 0 0 0 0 000010000D 505 + 110 0 0 2 0 0D 506 + 102 395 0 0 0 0 0 000010000D 507 + 102 0 0 1 0 0D 508 + 142 396 0 0 0 0 0 000010000D 509 + 142 0 0 1 0 0D 510 + 144 397 0 0 0 0 0 000000000D 511 + 144 0 0 1 0 S3P11 0D 512 + 128 398 0 0 0 0 0 000010000D 513 + 128 0 0 3 0 0D 514 + 110 401 0 0 0 0 0 000010000D 515 + 110 0 0 2 0 0D 516 + 126 403 0 0 0 0 0 000010000D 517 + 126 0 0 2 0 0D 518 + 110 405 0 0 0 0 0 000010000D 519 + 110 0 0 1 0 0D 520 + 126 406 0 0 0 0 0 000010000D 521 + 126 0 0 2 0 0D 522 + 102 408 0 0 0 0 0 000010000D 523 + 102 0 0 1 0 0D 524 + 142 409 0 0 0 0 0 000010000D 525 + 142 0 0 1 0 0D 526 + 144 410 0 0 0 0 0 000000000D 527 + 144 0 0 1 0 S3P12 0D 528 + 128 411 0 0 0 0 0 000010000D 529 + 128 0 0 3 0 0D 530 + 126 414 0 0 0 0 0 000010000D 531 + 126 0 0 2 0 0D 532 + 110 416 0 0 0 0 0 000010000D 533 + 110 0 0 1 0 0D 534 + 126 417 0 0 0 0 0 000010000D 535 + 126 0 0 2 0 0D 536 + 110 419 0 0 0 0 0 000010000D 537 + 110 0 0 1 0 0D 538 + 102 420 0 0 0 0 0 000010000D 539 + 102 0 0 1 0 0D 540 + 142 421 0 0 0 0 0 000010000D 541 + 142 0 0 1 0 0D 542 + 144 422 0 0 0 0 0 000000000D 543 + 144 0 0 1 0 S3P20 0D 544 + 128 423 0 0 0 0 0 000010000D 545 + 128 0 0 4 0 0D 546 + 110 427 0 0 0 0 0 000010000D 547 + 110 0 0 1 0 0D 548 + 126 428 0 0 0 0 0 000010000D 549 + 126 0 0 2 0 0D 550 + 110 430 0 0 0 0 0 000010000D 551 + 110 0 0 1 0 0D 552 + 126 431 0 0 0 0 0 000010000D 553 + 126 0 0 2 0 0D 554 + 102 433 0 0 0 0 0 000010000D 555 + 102 0 0 1 0 0D 556 + 142 434 0 0 0 0 0 000010000D 557 + 142 0 0 1 0 0D 558 + 144 435 0 0 0 0 0 000000000D 559 + 144 0 0 1 0 S3P21 0D 560 + 128 436 0 0 0 0 0 000010000D 561 + 128 0 0 3 0 0D 562 + 126 439 0 0 0 0 0 000010000D 563 + 126 0 0 2 0 0D 564 + 110 441 0 0 0 0 0 000010000D 565 + 110 0 0 1 0 0D 566 + 126 442 0 0 0 0 0 000010000D 567 + 126 0 0 2 0 0D 568 + 110 444 0 0 0 0 0 000010000D 569 + 110 0 0 1 0 0D 570 + 102 445 0 0 0 0 0 000010000D 571 + 102 0 0 1 0 0D 572 + 142 446 0 0 0 0 0 000010000D 573 + 142 0 0 1 0 0D 574 + 144 447 0 0 0 0 0 000000000D 575 + 144 0 0 1 0 S3P22 0D 576 + 128 448 0 0 0 0 0 000010000D 577 + 128 0 0 3 0 0D 578 + 110 451 0 0 0 0 0 000010000D 579 + 110 0 0 1 0 0D 580 + 126 452 0 0 0 0 0 000010000D 581 + 126 0 0 2 0 0D 582 + 110 454 0 0 0 0 0 000010000D 583 + 110 0 0 1 0 0D 584 + 126 455 0 0 0 0 0 000010000D 585 + 126 0 0 2 0 0D 586 + 102 457 0 0 0 0 0 000010000D 587 + 102 0 0 1 0 0D 588 + 142 458 0 0 0 0 0 000010000D 589 + 142 0 0 1 0 0D 590 + 144 459 0 0 0 0 0 000000000D 591 + 144 0 0 1 0 S4P00 0D 592 + 128 460 0 0 0 0 0 000010000D 593 + 128 0 0 3 0 0D 594 + 126 463 0 0 0 0 0 000010000D 595 + 126 0 0 2 0 0D 596 + 110 465 0 0 0 0 0 000010000D 597 + 110 0 0 1 0 0D 598 + 126 466 0 0 0 0 0 000010000D 599 + 126 0 0 2 0 0D 600 + 110 468 0 0 0 0 0 000010000D 601 + 110 0 0 1 0 0D 602 + 102 469 0 0 0 0 0 000010000D 603 + 102 0 0 1 0 0D 604 + 142 470 0 0 0 0 0 000010000D 605 + 142 0 0 1 0 0D 606 + 144 471 0 0 0 0 0 000000000D 607 + 144 0 0 1 0 S4P01 0D 608 + 128 472 0 0 0 0 0 000010000D 609 + 128 0 0 3 0 0D 610 + 110 475 0 0 0 0 0 000010000D 611 + 110 0 0 1 0 0D 612 + 126 476 0 0 0 0 0 000010000D 613 + 126 0 0 2 0 0D 614 + 110 478 0 0 0 0 0 000010000D 615 + 110 0 0 1 0 0D 616 + 126 479 0 0 0 0 0 000010000D 617 + 126 0 0 2 0 0D 618 + 102 481 0 0 0 0 0 000010000D 619 + 102 0 0 1 0 0D 620 + 142 482 0 0 0 0 0 000010000D 621 + 142 0 0 1 0 0D 622 + 144 483 0 0 0 0 0 000000000D 623 + 144 0 0 1 0 S4P02 0D 624 + 128 484 0 0 0 0 0 000010000D 625 + 128 0 0 3 0 0D 626 + 126 487 0 0 0 0 0 000010000D 627 + 126 0 0 2 0 0D 628 + 110 489 0 0 0 0 0 000010000D 629 + 110 0 0 1 0 0D 630 + 126 490 0 0 0 0 0 000010000D 631 + 126 0 0 2 0 0D 632 + 110 492 0 0 0 0 0 000010000D 633 + 110 0 0 1 0 0D 634 + 102 493 0 0 0 0 0 000010000D 635 + 102 0 0 1 0 0D 636 + 142 494 0 0 0 0 0 000010000D 637 + 142 0 0 1 0 0D 638 + 144 495 0 0 0 0 0 000000000D 639 + 144 0 0 1 0 S4P10 0D 640 + 128 496 0 0 0 0 0 000010000D 641 + 128 0 0 4 0 0D 642 + 110 500 0 0 0 0 0 000010000D 643 + 110 0 0 1 0 0D 644 + 126 501 0 0 0 0 0 000010000D 645 + 126 0 0 2 0 0D 646 + 110 503 0 0 0 0 0 000010000D 647 + 110 0 0 1 0 0D 648 + 126 504 0 0 0 0 0 000010000D 649 + 126 0 0 2 0 0D 650 + 102 506 0 0 0 0 0 000010000D 651 + 102 0 0 1 0 0D 652 + 142 507 0 0 0 0 0 000010000D 653 + 142 0 0 1 0 0D 654 + 144 508 0 0 0 0 0 000000000D 655 + 144 0 0 1 0 S4P11 0D 656 + 128 509 0 0 0 0 0 000010000D 657 + 128 0 0 3 0 0D 658 + 126 512 0 0 0 0 0 000010000D 659 + 126 0 0 2 0 0D 660 + 110 514 0 0 0 0 0 000010000D 661 + 110 0 0 1 0 0D 662 + 126 515 0 0 0 0 0 000010000D 663 + 126 0 0 2 0 0D 664 + 110 517 0 0 0 0 0 000010000D 665 + 110 0 0 1 0 0D 666 + 102 518 0 0 0 0 0 000010000D 667 + 102 0 0 1 0 0D 668 + 142 519 0 0 0 0 0 000010000D 669 + 142 0 0 1 0 0D 670 + 144 520 0 0 0 0 0 000000000D 671 + 144 0 0 1 0 S4P12 0D 672 + 128 521 0 0 0 0 0 000010000D 673 + 128 0 0 3 0 0D 674 + 110 524 0 0 0 0 0 000010000D 675 + 110 0 0 1 0 0D 676 + 126 525 0 0 0 0 0 000010000D 677 + 126 0 0 2 0 0D 678 + 110 527 0 0 0 0 0 000010000D 679 + 110 0 0 1 0 0D 680 + 126 528 0 0 0 0 0 000010000D 681 + 126 0 0 2 0 0D 682 + 102 530 0 0 0 0 0 000010000D 683 + 102 0 0 1 0 0D 684 + 142 531 0 0 0 0 0 000010000D 685 + 142 0 0 1 0 0D 686 + 144 532 0 0 0 0 0 000000000D 687 + 144 0 0 1 0 S4P20 0D 688 + 128 533 0 0 0 0 0 000010000D 689 + 128 0 0 3 0 0D 690 + 126 536 0 0 0 0 0 000010000D 691 + 126 0 0 2 0 0D 692 + 110 538 0 0 0 0 0 000010000D 693 + 110 0 0 1 0 0D 694 + 126 539 0 0 0 0 0 000010000D 695 + 126 0 0 2 0 0D 696 + 110 541 0 0 0 0 0 000010000D 697 + 110 0 0 1 0 0D 698 + 102 542 0 0 0 0 0 000010000D 699 + 102 0 0 1 0 0D 700 + 142 543 0 0 0 0 0 000010000D 701 + 142 0 0 1 0 0D 702 + 144 544 0 0 0 0 0 000000000D 703 + 144 0 0 1 0 S4P21 0D 704 + 128 545 0 0 0 0 0 000010000D 705 + 128 0 0 3 0 0D 706 + 110 548 0 0 0 0 0 000010000D 707 + 110 0 0 1 0 0D 708 + 126 549 0 0 0 0 0 000010000D 709 + 126 0 0 2 0 0D 710 + 110 551 0 0 0 0 0 000010000D 711 + 110 0 0 1 0 0D 712 + 126 552 0 0 0 0 0 000010000D 713 + 126 0 0 2 0 0D 714 + 102 554 0 0 0 0 0 000010000D 715 + 102 0 0 1 0 0D 716 + 142 555 0 0 0 0 0 000010000D 717 + 142 0 0 1 0 0D 718 + 144 556 0 0 0 0 0 000000000D 719 + 144 0 0 1 0 S4P22 0D 720 + 128 557 0 0 0 0 0 000010000D 721 + 128 0 0 3 0 0D 722 + 126 560 0 0 0 0 0 000010000D 723 + 126 0 0 2 0 0D 724 + 110 562 0 0 0 0 0 000010000D 725 + 110 0 0 1 0 0D 726 + 126 563 0 0 0 0 0 000010000D 727 + 126 0 0 2 0 0D 728 + 110 565 0 0 0 0 0 000010000D 729 + 110 0 0 1 0 0D 730 + 102 566 0 0 0 0 0 000010000D 731 + 102 0 0 1 0 0D 732 + 142 567 0 0 0 0 0 000010000D 733 + 142 0 0 1 0 0D 734 + 144 568 0 0 0 0 0 000000000D 735 + 144 0 0 1 0 S5P00 0D 736 + 128 569 0 0 0 0 0 000010000D 737 + 128 0 0 3 0 0D 738 + 110 572 0 0 0 0 0 000010000D 739 + 110 0 0 1 0 0D 740 + 126 573 0 0 0 0 0 000010000D 741 + 126 0 0 2 0 0D 742 + 110 575 0 0 0 0 0 000010000D 743 + 110 0 0 1 0 0D 744 + 126 576 0 0 0 0 0 000010000D 745 + 126 0 0 2 0 0D 746 + 102 578 0 0 0 0 0 000010000D 747 + 102 0 0 1 0 0D 748 + 142 579 0 0 0 0 0 000010000D 749 + 142 0 0 1 0 0D 750 + 144 580 0 0 0 0 0 000000000D 751 + 144 0 0 1 0 S5P01 0D 752 + 128 581 0 0 0 0 0 000010000D 753 + 128 0 0 3 0 0D 754 + 126 584 0 0 0 0 0 000010000D 755 + 126 0 0 2 0 0D 756 + 110 586 0 0 0 0 0 000010000D 757 + 110 0 0 1 0 0D 758 + 126 587 0 0 0 0 0 000010000D 759 + 126 0 0 2 0 0D 760 + 110 589 0 0 0 0 0 000010000D 761 + 110 0 0 1 0 0D 762 + 102 590 0 0 0 0 0 000010000D 763 + 102 0 0 1 0 0D 764 + 142 591 0 0 0 0 0 000010000D 765 + 142 0 0 1 0 0D 766 + 144 592 0 0 0 0 0 000000000D 767 + 144 0 0 1 0 S5P02 0D 768 + 128 593 0 0 0 0 0 000010000D 769 + 128 0 0 3 0 0D 770 + 110 596 0 0 0 0 0 000010000D 771 + 110 0 0 1 0 0D 772 + 126 597 0 0 0 0 0 000010000D 773 + 126 0 0 2 0 0D 774 + 110 599 0 0 0 0 0 000010000D 775 + 110 0 0 2 0 0D 776 + 126 601 0 0 0 0 0 000010000D 777 + 126 0 0 2 0 0D 778 + 102 603 0 0 0 0 0 000010000D 779 + 102 0 0 1 0 0D 780 + 142 604 0 0 0 0 0 000010000D 781 + 142 0 0 1 0 0D 782 + 144 605 0 0 0 0 0 000000000D 783 + 144 0 0 1 0 S5P10 0D 784 + 128 606 0 0 0 0 0 000010000D 785 + 128 0 0 4 0 0D 786 + 126 610 0 0 0 0 0 000010000D 787 + 126 0 0 2 0 0D 788 + 110 612 0 0 0 0 0 000010000D 789 + 110 0 0 2 0 0D 790 + 126 614 0 0 0 0 0 000010000D 791 + 126 0 0 2 0 0D 792 + 110 616 0 0 0 0 0 000010000D 793 + 110 0 0 2 0 0D 794 + 102 618 0 0 0 0 0 000010000D 795 + 102 0 0 1 0 0D 796 + 142 619 0 0 0 0 0 000010000D 797 + 142 0 0 1 0 0D 798 + 144 620 0 0 0 0 0 000000000D 799 + 144 0 0 1 0 S5P11 0D 800 + 128 621 0 0 0 0 0 000010000D 801 + 128 0 0 3 0 0D 802 + 110 624 0 0 0 0 0 000010000D 803 + 110 0 0 2 0 0D 804 + 126 626 0 0 0 0 0 000010000D 805 + 126 0 0 2 0 0D 806 + 110 628 0 0 0 0 0 000010000D 807 + 110 0 0 1 0 0D 808 + 126 629 0 0 0 0 0 000010000D 809 + 126 0 0 2 0 0D 810 + 102 631 0 0 0 0 0 000010000D 811 + 102 0 0 1 0 0D 812 + 142 632 0 0 0 0 0 000010000D 813 + 142 0 0 1 0 0D 814 + 144 633 0 0 0 0 0 000000000D 815 + 144 0 0 1 0 S5P12 0D 816 + 128 634 0 0 0 0 0 000010000D 817 + 128 0 0 3 0 0D 818 + 126 637 0 0 0 0 0 000010000D 819 + 126 0 0 2 0 0D 820 + 110 639 0 0 0 0 0 000010000D 821 + 110 0 0 1 0 0D 822 + 126 640 0 0 0 0 0 000010000D 823 + 126 0 0 2 0 0D 824 + 110 642 0 0 0 0 0 000010000D 825 + 110 0 0 1 0 0D 826 + 102 643 0 0 0 0 0 000010000D 827 + 102 0 0 1 0 0D 828 + 142 644 0 0 0 0 0 000010000D 829 + 142 0 0 1 0 0D 830 + 144 645 0 0 0 0 0 000000000D 831 + 144 0 0 1 0 S5P20 0D 832 + 128 646 0 0 0 0 0 000010000D 833 + 128 0 0 3 0 0D 834 + 110 649 0 0 0 0 0 000010000D 835 + 110 0 0 1 0 0D 836 + 126 650 0 0 0 0 0 000010000D 837 + 126 0 0 2 0 0D 838 + 110 652 0 0 0 0 0 000010000D 839 + 110 0 0 1 0 0D 840 + 126 653 0 0 0 0 0 000010000D 841 + 126 0 0 2 0 0D 842 + 102 655 0 0 0 0 0 000010000D 843 + 102 0 0 1 0 0D 844 + 142 656 0 0 0 0 0 000010000D 845 + 142 0 0 1 0 0D 846 + 144 657 0 0 0 0 0 000000000D 847 + 144 0 0 1 0 S5P21 0D 848 + 128 658 0 0 0 0 0 000010000D 849 + 128 0 0 3 0 0D 850 + 126 661 0 0 0 0 0 000010000D 851 + 126 0 0 2 0 0D 852 + 110 663 0 0 0 0 0 000010000D 853 + 110 0 0 1 0 0D 854 + 126 664 0 0 0 0 0 000010000D 855 + 126 0 0 2 0 0D 856 + 110 666 0 0 0 0 0 000010000D 857 + 110 0 0 1 0 0D 858 + 102 667 0 0 0 0 0 000010000D 859 + 102 0 0 1 0 0D 860 + 142 668 0 0 0 0 0 000010000D 861 + 142 0 0 1 0 0D 862 + 144 669 0 0 0 0 0 000000000D 863 + 144 0 0 1 0 S5P22 0D 864 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 1P 1 +0.,0.,33.333333333,0.,33.333333333,0.,0.,33.333333333, 1P 2 +33.333333333,0.,0.,1.,0.,1.; 1P 3 +110,0.,0.,0.,0.,33.333333333,0.; 3P 4 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,0., 5P 5 +33.333333333,33.333333333,0.,0.,1.,0.,0.,0.; 5P 6 +110,33.333333333,33.333333333,0.,33.333333333,0.,0.; 7P 7 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,0.,0.,0.,0., 9P 8 +0.,1.,0.,0.,0.; 9P 9 +102,4,3,5,7,9; 11P 10 +142,0,1,0,11,2; 13P 11 +144,1,1,0,13; 15P 12 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 17P 13 +33.333333333,0.,0.,33.333333333,33.333333333,0.,66.666666667,0., 17P 14 +0.,66.666666667,33.333333333,0.,0.,1.,0.,1.; 17P 15 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,0., 19P 16 +33.333333333,33.333333333,0.,0.,1.,0.,0.,0.; 19P 17 +110,33.333333333,33.333333333,0.,66.666666667,33.333333333,0.; 21P 18 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,33.333333333,0., 23P 19 +66.666666667,0.,0.,0.,1.,0.,0.,0.; 23P 20 +110,33.333333333,0.,0.,66.666666667,0.,0.; 25P 21 +102,4,19,21,23,25; 27P 22 +142,0,17,0,27,2; 29P 23 +144,17,1,0,29; 31P 24 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 33P 25 +66.666666667,0.,0.,66.666666667,33.333333333,0.,100.0,0.,0., 33P 26 +100.0,33.333333333,0.,0.,1.,0.,1.; 33P 27 +110,66.666666667,0.,0.,66.666666667,33.333333333,0.; 35P 28 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,33.333333333,0., 37P 29 +100.0,33.333333333,0.,0.,1.,0.,0.,0.; 37P 30 +110,100.0,0.,0.,100.0,33.333333333,0.; 39P 31 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,0.,66.686666667,0., 41P 32 +0.,0.,1.,0.,0.,0.; 41P 33 +102,4,35,37,39,41; 43P 34 +142,0,33,0,43,2; 45P 35 +144,33,1,0,45; 47P 36 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 49P 37 +33.333333333,0.,0.,66.666666667,0.,33.333333333,33.333333333,0., 49P 38 +33.333333333,66.666666667,0.,0.,1.,0.,1.; 49P 39 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,0.,0., 51P 40 +66.666666667,0.,0.,1.,0.,0.,0.; 51P 41 +110,33.333333333,66.666666667,0.,0.,66.666666667,0.; 53P 42 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,66.666666667,0., 55P 43 +33.333333333,33.353333333,0.,0.,1.,0.,0.,0.; 55P 44 +110,33.333333333,33.333333333,0.,0.,33.333333333,0.; 57P 45 +102,4,51,53,55,57; 59P 46 +142,0,49,0,59,2; 61P 47 +144,49,1,0,61; 63P 48 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 65P 49 +33.333333333,33.333333333,0.,33.333333333,66.666666667,0., 65P 50 +66.666666667,33.333333333,0.,66.666666667,66.666666667,0.,0.,1., 65P 51 +0.,1.; 65P 52 +110,33.333333333,66.666666667,0.,33.333333333,33.333333333,0.; 67P 53 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,66.666666667,0., 69P 54 +66.646666667,66.666666667,0.,0.,1.,0.,0.,0.; 69P 55 +110,66.666666667,66.666666667,0.,66.666666667,33.333333333,0.; 71P 56 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,33.333333333,0., 73P 57 +33.333333333,33.333333333,0.,0.,1.,0.,0.,0.; 73P 58 +102,4,67,69,71,73; 75P 59 +142,0,65,0,75,2; 77P 60 +144,65,1,0,77; 79P 61 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 81P 62 +66.666666667,33.333333333,0.,66.666666667,66.666666667,0.,100.0, 81P 63 +33.333333333,0.,100.0,66.666666667,0.,0.,1.,0.,1.; 81P 64 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,33.333333333,0., 83P 65 +66.666666667,66.646666667,0.,0.,1.,0.,0.,0.; 83P 66 +110,66.666666667,66.666666667,0.,100.0,66.666666667,0.; 85P 67 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667,0.,100.0, 87P 68 +33.333333333,0.,0.,1.,0.,0.,0.; 87P 69 +110,100.0,33.333333333,0.,66.666666667,33.333333333,0.; 89P 70 +102,4,83,85,87,89; 91P 71 +142,0,81,0,91,2; 93P 72 +144,81,1,0,93; 95P 73 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 97P 74 +66.666666667,0.,0.,100.0,0.,33.333333333,66.666666667,0., 97P 75 +33.333333333,100.0,0.,0.,1.,0.,1.; 97P 76 +110,0.,66.666666667,0.,0.,100.0,0.; 99P 77 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,0.,33.333333333, 101P 78 +100.0,0.,0.,1.,0.,0.,0.; 101P 79 +110,33.333333333,100.0,0.,33.333333333,66.666666667,0.; 103P 80 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,0., 105P 81 +33.333333333,66.666666667,0.,0.,1.,0.,0.,0.; 105P 82 +102,4,99,101,103,105; 107P 83 +142,0,97,0,107,2; 109P 84 +144,97,1,0,109; 111P 85 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 113P 86 +33.333333333,66.666666667,0.,33.333333333,100.0,0.,66.666666667, 113P 87 +66.666666667,0.,66.666666667,100.0,0.,0.,1.,0.,1.; 113P 88 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,66.666666667,0., 115P 89 +33.333333333,100.0,0.,0.,1.,0.,0.,0.; 115P 90 +110,33.333333333,100.0,0.,66.666666667,100.0,0.; 117P 91 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,66.666666667,0., 119P 92 +66.666666667,100.0,0.,0.,1.,0.,0.,0.; 119P 93 +110,66.666666667,66.666666667,0.,33.333333333,66.666666667,0.; 121P 94 +102,4,115,117,119,121; 123P 95 +142,0,113,0,123,2; 125P 96 +144,113,1,0,125; 127P 97 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 129P 98 +66.666666667,66.666666667,0.,66.666666667,100.0,0.,100.0, 129P 99 +66.666666667,0.,100.0,100.0,0.,0.,1.,0.,1.; 129P 100 +110,66.666666667,66.666666667,0.,66.666666667,100.0,0.; 131P 101 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,0.,66.666666667, 133P 102 +100.0,0.,0.,1.,0.,0.,0.; 133P 103 +110,100.0,100.0,0.,100.0,66.666666667,0.; 135P 104 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667,0., 137P 105 +66.686666667,66.666666667,0.,0.,1.,0.,0.,0.; 137P 106 +102,4,131,133,135,137; 139P 107 +142,0,129,0,139,2; 141P 108 +144,129,1,0,141; 143P 109 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 145P 110 +100.0,33.333333333,0.,100.0,0.,33.333333333,100.0,33.333333333, 145P 111 +33.333333333,100.0,0.,1.,0.,1.; 145P 112 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,100.0,0.,0., 147P 113 +100.0,0.,1.,0.,0.,0.; 147P 114 +110,33.333333333,0.,100.0,33.333333333,33.333333333,100.0; 149P 115 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,33.333333333, 151P 116 +100.0,0.02,33.333333333,100.0,0.,1.,0.,0.,0.; 151P 117 +110,0.,33.333333333,100.0,0.,0.,100.0; 153P 118 +102,4,147,149,151,153; 155P 119 +142,0,145,0,155,2; 157P 120 +144,145,1,0,157; 159P 121 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 161P 122 +33.333333333,100.0,33.333333333,33.333333333,100.0,0., 161P 123 +66.666666667,100.0,33.333333333,66.666666667,100.0,0.,1.,0.,1.; 161P 124 +110,0.,33.333333333,100.0,33.333333333,33.333333333,100.0; 163P 125 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,33.333333333, 165P 126 +100.0,33.333333333,66.646666667,100.0,0.,1.,0.,0.,0.; 165P 127 +110,33.333333333,66.666666667,100.0,0.,66.666666667,100.0; 167P 128 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,100.0,0., 169P 129 +33.333333333,100.0,0.,1.,0.,0.,0.; 169P 130 +102,4,163,165,167,169; 171P 131 +142,0,161,0,171,2; 173P 132 +144,161,1,0,173; 175P 133 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 177P 134 +66.666666667,100.0,33.333333333,66.666666667,100.0,0.,100.0, 177P 135 +100.0,33.333333333,100.0,100.0,0.,1.,0.,1.; 177P 136 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,100.0, 179P 137 +33.313333333,66.666666667,100.0,0.,1.,0.,0.,0.; 179P 138 +110,33.333333333,66.666666667,100.0,33.333333333,100.0,100.0; 181P 139 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0,100.0,0., 183P 140 +100.0,100.0,0.,1.,0.,0.,0.; 183P 141 +110,0.,66.666666667,100.0,0.,100.0,100.0; 185P 142 +102,4,179,181,183,185; 187P 143 +142,0,177,0,187,2; 189P 144 +144,177,1,0,189; 191P 145 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 193P 146 +33.333333333,0.,100.0,66.666666667,0.,100.0,33.333333333, 193P 147 +33.333333333,100.0,66.666666667,33.333333333,100.0,0.,1.,0.,1.; 193P 148 +110,33.333333333,0.,100.0,66.666666667,0.,100.0; 195P 149 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,100.0, 197P 150 +66.666666667,33.333333333,100.0,0.,1.,0.,0.,0.; 197P 151 +110,33.333333333,33.333333333,100.0,66.666666667,33.333333333, 199P 152 +100.0; 199P 153 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,33.333333333, 201P 154 +100.0,33.333333333,0.,100.0,0.,1.,0.,0.,0.; 201P 155 +102,4,195,197,199,201; 203P 156 +142,0,193,0,203,2; 205P 157 +144,193,1,0,205; 207P 158 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 209P 159 +33.333333333,33.333333333,100.0,66.666666667,33.333333333,100.0, 209P 160 +33.333333333,66.666666667,100.0,66.666666667,66.666666667,100.0, 209P 161 +0.,1.,0.,1.; 209P 162 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,33.333333333, 211P 163 +100.0,66.666666667,33.333333333,100.0,0.,1.,0.,0.,0.; 211P 164 +110,66.666666667,66.666666667,100.0,66.666666667,33.333333333, 213P 165 +100.0; 213P 166 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,66.666666667, 215P 167 +100.0,33.333333333,66.666666667,100.0,0.,1.,0.,0.,0.; 215P 168 +110,33.333333333,66.666666667,100.0,33.333333333,33.333333333, 217P 169 +100.0; 217P 170 +102,4,211,213,215,217; 219P 171 +142,0,209,0,219,2; 221P 172 +144,209,1,0,221; 223P 173 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 225P 174 +33.333333333,66.666666667,100.0,66.666666667,66.666666667,100.0, 225P 175 +33.333333333,100.0,100.0,66.666666667,100.0,100.0,0.,1.,0.,1.; 225P 176 +110,66.666666667,66.666666667,100.0,33.333333333,66.666666667, 227P 177 +100.0; 227P 178 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,66.666666667, 229P 179 +100.0,66.666666667,100.0,100.0,0.,1.,0.,0.,0.; 229P 180 +110,66.666666667,100.0,100.0,33.333333333,100.0,100.0; 231P 181 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0,100.0, 233P 182 +33.333333333,66.686666667,100.0,0.,1.,0.,0.,0.; 233P 183 +102,4,227,229,231,233; 235P 184 +142,0,225,0,235,2; 237P 185 +144,225,1,0,237; 239P 186 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 241P 187 +66.666666667,0.,100.0,100.0,0.,100.0,66.666666667,33.333333333, 241P 188 +100.0,100.0,33.333333333,100.0,0.,1.,0.,1.; 241P 189 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,100.0,100.0, 243P 190 +0.,100.0,0.,1.,0.,0.,0.; 243P 191 +110,100.0,0.,100.0,100.0,33.333333333,100.0; 245P 192 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,33.333333333,100.0, 247P 193 +66.686666667,33.333333333,100.0,0.,1.,0.,0.,0.; 247P 194 +110,66.666666667,33.333333333,100.0,66.666666667,0.,100.0; 249P 195 +102,4,243,245,247,249; 251P 196 +142,0,241,0,251,2; 253P 197 +144,241,1,0,253; 255P 198 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 257P 199 +66.666666667,33.333333333,100.0,100.0,33.333333333,100.0, 257P 200 +66.666666667,66.666666667,100.0,100.0,66.666666667,100.0,0.,1., 257P 201 +0.,1.; 257P 202 +110,66.666666667,33.333333333,100.0,100.0,33.333333333,100.0; 259P 203 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,33.333333333,100.0, 261P 204 +100.0,66.646666667,100.0,0.,1.,0.,0.,0.; 261P 205 +110,100.0,66.666666667,100.0,66.666666667,66.666666667,100.0; 263P 206 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,33.333333333, 265P 207 +100.0,66.666666667,66.666666667,100.0,0.,1.,0.,0.,0.; 265P 208 +102,4,259,261,263,265; 267P 209 +142,0,257,0,267,2; 269P 210 +144,257,1,0,269; 271P 211 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 273P 212 +66.666666667,66.666666667,100.0,100.0,66.666666667,100.0, 273P 213 +66.666666667,100.0,100.0,100.0,100.0,100.0,0.,1.,0.,1.; 273P 214 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,66.666666667, 275P 215 +100.0,99.98,66.666666667,100.0,0.,1.,0.,0.,0.; 275P 216 +110,100.0,66.666666667,100.0,100.0,100.0,100.0; 277P 217 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0,100.0, 279P 218 +100.0,100.0,100.0,0.,1.,0.,0.,0.; 279P 219 +110,66.666666667,100.0,100.0,66.666666667,66.666666667,100.0; 281P 220 +102,4,275,277,279,281; 283P 221 +142,0,273,0,283,2; 285P 222 +144,273,1,0,285; 287P 223 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 289P 224 +0.,33.333333333,0.,0.,0.,0.,33.333333333,33.333333333,0., 289P 225 +33.333333333,0.,1.,0.,1.; 289P 226 +110,0.,0.,0.,33.333333333,0.,0.; 291P 227 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,33.333333333, 293P 228 +33.333333333,0.,0.,0.,1.,0.,0.,0.; 293P 229 +110,33.333333333,0.,33.333333333,0.,0.,33.333333333; 295P 230 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,0.,33.333333333,0.,0.,0., 297P 231 +0.,1.,0.,0.,0.; 297P 232 +102,4,291,293,295,297; 299P 233 +142,0,289,0,299,2; 301P 234 +144,289,1,0,301; 303P 235 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 305P 236 +33.333333333,33.333333333,0.,33.333333333,0.,0.,66.666666667, 305P 237 +33.333333333,0.,66.666666667,0.,1.,0.,1.; 305P 238 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,33.333333333, 307P 239 +0.,0.,33.333333333,0.,1.,0.,0.,0.; 307P 240 +110,33.333333333,0.,33.333333333,33.333333333,0.,66.666666667; 309P 241 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,66.666666667, 311P 242 +0.,0.,66.666666667,0.,1.,0.,0.,0.; 311P 243 +110,0.,0.,66.666666667,0.,0.,33.333333333; 313P 244 +102,4,307,309,311,313; 315P 245 +142,0,305,0,315,2; 317P 246 +144,305,1,0,317; 319P 247 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 321P 248 +66.666666667,33.333333333,0.,66.666666667,0.,0.,100.0, 321P 249 +33.333333333,0.,100.0,0.,1.,0.,1.; 321P 250 +110,0.,0.,66.666666667,33.333333333,0.,66.666666667; 323P 251 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,66.666666667, 325P 252 +33.333333333,0.,100.0,0.,1.,0.,0.,0.; 325P 253 +110,33.333333333,0.,100.0,0.,0.,100.0; 327P 254 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,0.,100.0,0.,0., 329P 255 +66.686666667,0.,1.,0.,0.,0.; 329P 256 +102,4,323,325,327,329; 331P 257 +142,0,321,0,331,2; 333P 258 +144,321,1,0,333; 335P 259 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 337P 260 +33.333333333,0.,0.,66.666666667,0.,0.,33.333333333,0., 337P 261 +33.333333333,66.666666667,0.,33.333333333,0.,1.,0.,1.; 337P 262 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,0., 339P 263 +66.666666667,0.,0.,0.,1.,0.,0.,0.; 339P 264 +110,66.666666667,0.,0.,66.666666667,0.,33.333333333; 341P 265 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,33.333333333, 343P 266 +33.353333333,0.,33.333333333,0.,1.,0.,0.,0.; 343P 267 +110,33.333333333,0.,0.,33.333333333,0.,33.333333333; 345P 268 +102,4,339,341,343,345; 347P 269 +142,0,337,0,347,2; 349P 270 +144,337,1,0,349; 351P 271 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 353P 272 +33.333333333,0.,33.333333333,66.666666667,0.,33.333333333, 353P 273 +33.333333333,0.,66.666666667,66.666666667,0.,66.666666667,0.,1., 353P 274 +0.,1.; 353P 275 +110,33.333333333,0.,33.333333333,66.666666667,0.,33.333333333; 355P 276 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,33.333333333, 357P 277 +66.666666667,0.,66.646666667,0.,1.,0.,0.,0.; 357P 278 +110,33.333333333,0.,66.666666667,66.666666667,0.,66.666666667; 359P 279 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,66.666666667, 361P 280 +33.333333333,0.,33.333333333,0.,1.,0.,0.,0.; 361P 281 +102,4,355,357,359,361; 363P 282 +142,0,353,0,363,2; 365P 283 +144,353,1,0,365; 367P 284 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 369P 285 +33.333333333,0.,66.666666667,66.666666667,0.,66.666666667, 369P 286 +33.333333333,0.,100.0,66.666666667,0.,100.0,0.,1.,0.,1.; 369P 287 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,0.,66.666666667, 371P 288 +66.646666667,0.,66.666666667,0.,1.,0.,0.,0.; 371P 289 +110,66.666666667,0.,100.0,66.666666667,0.,66.666666667; 373P 290 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,100.0, 375P 291 +33.333333333,0.,100.0,0.,1.,0.,0.,0.; 375P 292 +110,33.333333333,0.,100.0,33.333333333,0.,66.666666667; 377P 293 +102,4,371,373,375,377; 379P 294 +142,0,369,0,379,2; 381P 295 +144,369,1,0,381; 383P 296 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 385P 297 +66.666666667,0.,0.,100.0,0.,0.,66.666666667,0.,33.333333333, 385P 298 +100.0,0.,33.333333333,0.,1.,0.,1.; 385P 299 +110,100.0,0.,0.,66.666666667,0.,0.; 387P 300 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,0.,100.0,0., 389P 301 +33.333333333,0.,1.,0.,0.,0.; 389P 302 +110,100.0,0.,33.333333333,66.666666667,0.,33.333333333; 391P 303 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,33.333333333, 393P 304 +66.666666667,0.,0.,0.,1.,0.,0.,0.; 393P 305 +102,4,387,389,391,393; 395P 306 +142,0,385,0,395,2; 397P 307 +144,385,1,0,397; 399P 308 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 401P 309 +66.666666667,0.,33.333333333,100.0,0.,33.333333333,66.666666667, 401P 310 +0.,66.666666667,100.0,0.,66.666666667,0.,1.,0.,1.; 401P 311 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,33.333333333, 403P 312 +100.0,0.,33.333333333,0.,1.,0.,0.,0.; 403P 313 +110,100.0,0.,33.333333333,100.0,0.,66.666666667; 405P 314 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,66.666666667, 407P 315 +66.666666667,0.,66.666666667,0.,1.,0.,0.,0.; 407P 316 +110,66.666666667,0.,66.666666667,66.666666667,0.,33.333333333; 409P 317 +102,4,403,405,407,409; 411P 318 +142,0,401,0,411,2; 413P 319 +144,401,1,0,413; 415P 320 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 417P 321 +66.666666667,0.,66.666666667,100.0,0.,66.666666667,66.666666667, 417P 322 +0.,100.0,100.0,0.,100.0,0.,1.,0.,1.; 417P 323 +110,66.666666667,0.,66.666666667,100.0,0.,66.666666667; 419P 324 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,66.666666667,100.0, 421P 325 +0.,100.0,0.,1.,0.,0.,0.; 421P 326 +110,100.0,0.,100.0,66.666666667,0.,100.0; 423P 327 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,0.,66.686666667, 425P 328 +66.666666667,0.,100.0,0.,1.,0.,0.,0.; 425P 329 +102,4,419,421,423,425; 427P 330 +142,0,417,0,427,2; 429P 331 +144,417,1,0,429; 431P 332 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 433P 333 +100.0,0.,0.,100.0,33.333333333,33.333333333,100.0,0., 433P 334 +33.333333333,100.0,33.333333333,0.,1.,0.,1.; 433P 335 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,0.,0.,100.0, 435P 336 +33.333333333,0.,1.,0.,0.,0.; 435P 337 +110,0.,100.0,33.333333333,33.333333333,100.0,33.333333333; 437P 338 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0,0.02, 439P 339 +33.333333333,100.0,33.333333333,0.,1.,0.,0.,0.; 439P 340 +110,33.333333333,100.0,0.,0.,100.0,0.; 441P 341 +102,4,435,437,439,441; 443P 342 +142,0,433,0,443,2; 445P 343 +144,433,1,0,445; 447P 344 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 449P 345 +33.333333333,100.0,0.,33.333333333,100.0,33.333333333, 449P 346 +66.666666667,100.0,0.,66.666666667,100.0,33.333333333,0.,1.,0., 449P 347 +1.; 449P 348 +110,33.333333333,100.0,0.,33.333333333,100.0,33.333333333; 451P 349 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.646666667,100.0, 453P 350 +33.333333333,33.333333333,100.0,33.333333333,0.,1.,0.,0.,0.; 453P 351 +110,66.666666667,100.0,33.333333333,66.666666667,100.0,0.; 455P 352 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0,0., 457P 353 +33.333333333,100.0,0.,0.,1.,0.,0.,0.; 457P 354 +102,4,451,453,455,457; 459P 355 +142,0,449,0,459,2; 461P 356 +144,449,1,0,461; 463P 357 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 465P 358 +66.666666667,100.0,0.,66.666666667,100.0,33.333333333,100.0, 465P 359 +100.0,0.,100.0,100.0,33.333333333,0.,1.,0.,1.; 465P 360 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0, 467P 361 +33.313333333,66.666666667,100.0,0.,0.,1.,0.,0.,0.; 467P 362 +110,66.666666667,100.0,33.333333333,100.0,100.0,33.333333333; 469P 363 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,33.333333333, 471P 364 +100.0,100.0,0.,0.,1.,0.,0.,0.; 471P 365 +110,100.0,100.0,0.,66.666666667,100.0,0.; 473P 366 +102,4,467,469,471,473; 475P 367 +142,0,465,0,475,2; 477P 368 +144,465,1,0,477; 479P 369 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 481P 370 +100.0,33.333333333,0.,100.0,66.666666667,33.333333333,100.0, 481P 371 +33.333333333,33.333333333,100.0,66.666666667,0.,1.,0.,1.; 481P 372 +110,0.,100.0,33.333333333,0.,100.0,66.666666667; 483P 373 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,66.666666667, 485P 374 +33.333333333,100.0,66.666666667,0.,1.,0.,0.,0.; 485P 375 +110,33.333333333,100.0,66.666666667,33.333333333,100.0, 487P 376 +33.333333333; 487P 377 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0, 489P 378 +33.333333333,0.,100.0,33.333333333,0.,1.,0.,0.,0.; 489P 379 +102,4,483,485,487,489; 491P 380 +142,0,481,0,491,2; 493P 381 +144,481,1,0,493; 495P 382 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 497P 383 +33.333333333,100.0,33.333333333,33.333333333,100.0,66.666666667, 497P 384 +66.666666667,100.0,33.333333333,66.666666667,100.0,66.666666667, 497P 385 +0.,1.,0.,1.; 497P 386 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0, 499P 387 +33.333333333,33.333333333,100.0,66.666666667,0.,1.,0.,0.,0.; 499P 388 +110,33.333333333,100.0,66.666666667,66.666666667,100.0, 501P 389 +66.666666667; 501P 390 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0, 503P 391 +66.666666667,66.666666667,100.0,33.333333333,0.,1.,0.,0.,0.; 503P 392 +110,33.333333333,100.0,33.333333333,66.666666667,100.0, 505P 393 +33.333333333; 505P 394 +102,4,499,501,503,505; 507P 395 +142,0,497,0,507,2; 509P 396 +144,497,1,0,509; 511P 397 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 513P 398 +66.666666667,100.0,33.333333333,66.666666667,100.0,66.666666667, 513P 399 +100.0,100.0,33.333333333,100.0,100.0,66.666666667,0.,1.,0.,1.; 513P 400 +110,66.666666667,100.0,33.333333333,66.666666667,100.0, 515P 401 +66.666666667; 515P 402 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0, 517P 403 +66.666666667,100.0,100.0,66.666666667,0.,1.,0.,0.,0.; 517P 404 +110,100.0,100.0,33.333333333,100.0,100.0,66.666666667; 519P 405 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,33.333333333, 521P 406 +66.686666667,100.0,33.333333333,0.,1.,0.,0.,0.; 521P 407 +102,4,515,517,519,521; 523P 408 +142,0,513,0,523,2; 525P 409 +144,513,1,0,525; 527P 410 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 529P 411 +100.0,66.666666667,0.,100.0,100.0,33.333333333,100.0, 529P 412 +66.666666667,33.333333333,100.0,100.0,0.,1.,0.,1.; 529P 413 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,66.666666667,0., 531P 414 +100.0,100.0,0.,1.,0.,0.,0.; 531P 415 +110,33.333333333,100.0,100.0,0.,100.0,100.0; 533P 416 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0,100.0, 535P 417 +33.333333333,100.0,66.686666667,0.,1.,0.,0.,0.; 535P 418 +110,33.333333333,100.0,66.666666667,0.,100.0,66.666666667; 537P 419 +102,4,531,533,535,537; 539P 420 +142,0,529,0,539,2; 541P 421 +144,529,1,0,541; 543P 422 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 545P 423 +33.333333333,100.0,66.666666667,33.333333333,100.0,100.0, 545P 424 +66.666666667,100.0,66.666666667,66.666666667,100.0,100.0,0.,1., 545P 425 +0.,1.; 545P 426 +110,33.333333333,100.0,100.0,33.333333333,100.0,66.666666667; 547P 427 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,33.333333333,100.0,100.0, 549P 428 +66.646666667,100.0,100.0,0.,1.,0.,0.,0.; 549P 429 +110,66.666666667,100.0,100.0,66.666666667,100.0,66.666666667; 551P 430 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0, 553P 431 +66.666666667,33.333333333,100.0,66.666666667,0.,1.,0.,0.,0.; 553P 432 +102,4,547,549,551,553; 555P 433 +142,0,545,0,555,2; 557P 434 +144,545,1,0,557; 559P 435 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1., 561P 436 +66.666666667,100.0,66.666666667,66.666666667,100.0,100.0,100.0, 561P 437 +100.0,66.666666667,100.0,100.0,100.0,0.,1.,0.,1.; 561P 438 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,66.666666667,100.0, 563P 439 +66.666666667,66.666666667,100.0,99.98,0.,1.,0.,0.,0.; 563P 440 +110,66.666666667,100.0,100.0,100.0,100.0,100.0; 565P 441 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,100.0,100.0,100.0, 567P 442 +66.666666667,0.,1.,0.,0.,0.; 567P 443 +110,100.0,100.0,66.666666667,66.666666667,100.0,66.666666667; 569P 444 +102,4,563,565,567,569; 571P 445 +142,0,561,0,571,2; 573P 446 +144,561,1,0,573; 575P 447 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 577P 448 +0.,0.,0.,33.333333333,0.,33.333333333,0.,0.,33.333333333, 577P 449 +33.333333333,0.,1.,0.,1.; 577P 450 +110,0.,0.,0.,0.,0.,33.333333333; 579P 451 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,0.,33.333333333,0., 581P 452 +33.333333333,33.333333333,0.,1.,0.,0.,0.; 581P 453 +110,0.,33.333333333,33.333333333,0.,33.333333333,0.; 583P 454 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,0.,0.,0.,33.333333333,0., 585P 455 +0.,1.,0.,0.,0.; 585P 456 +102,4,579,581,583,585; 587P 457 +142,0,577,0,587,2; 589P 458 +144,577,1,0,589; 591P 459 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 593P 460 +33.333333333,0.,0.,33.333333333,33.333333333,0.,66.666666667,0., 593P 461 +0.,66.666666667,33.333333333,0.,1.,0.,1.; 593P 462 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,0.,0., 595P 463 +33.333333333,33.333333333,0.,1.,0.,0.,0.; 595P 464 +110,0.,33.333333333,33.333333333,0.,66.666666667,33.333333333; 597P 465 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,0.,0., 599P 466 +66.666666667,33.333333333,0.,1.,0.,0.,0.; 599P 467 +110,0.,66.666666667,0.,0.,33.333333333,0.; 601P 468 +102,4,595,597,599,601; 603P 469 +142,0,593,0,603,2; 605P 470 +144,593,1,0,605; 607P 471 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 609P 472 +66.666666667,0.,0.,66.666666667,33.333333333,0.,100.0,0.,0., 609P 473 +100.0,33.333333333,0.,1.,0.,1.; 609P 474 +110,0.,66.666666667,0.,0.,66.666666667,33.333333333; 611P 475 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,33.333333333,0., 613P 476 +66.666666667,33.333333333,0.,1.,0.,0.,0.; 613P 477 +110,0.,100.0,33.333333333,0.,100.0,0.; 615P 478 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,0.,0.,66.686666667, 617P 479 +0.,0.,1.,0.,0.,0.; 617P 480 +102,4,611,613,615,617; 619P 481 +142,0,609,0,619,2; 621P 482 +144,609,1,0,621; 623P 483 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 625P 484 +33.333333333,0.,0.,66.666666667,0.,33.333333333,33.333333333,0., 625P 485 +33.333333333,66.666666667,0.,1.,0.,1.; 625P 486 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,0.,66.666666667,0.,0., 627P 487 +33.333333333,0.,1.,0.,0.,0.; 627P 488 +110,0.,0.,66.666666667,0.,33.333333333,66.666666667; 629P 489 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,66.666666667, 631P 490 +0.,33.333333333,33.353333333,0.,1.,0.,0.,0.; 631P 491 +110,0.,33.333333333,33.333333333,0.,0.,33.333333333; 633P 492 +102,4,627,629,631,633; 635P 493 +142,0,625,0,635,2; 637P 494 +144,625,1,0,637; 639P 495 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 641P 496 +33.333333333,33.333333333,0.,33.333333333,66.666666667,0., 641P 497 +66.666666667,33.333333333,0.,66.666666667,66.666666667,0.,1.,0., 641P 498 +1.; 641P 499 +110,0.,33.333333333,33.333333333,0.,33.333333333,66.666666667; 643P 500 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,66.666666667, 645P 501 +0.,66.646666667,66.666666667,0.,1.,0.,0.,0.; 645P 502 +110,0.,66.666666667,66.666666667,0.,66.666666667,33.333333333; 647P 503 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,33.333333333, 649P 504 +0.,33.333333333,33.333333333,0.,1.,0.,0.,0.; 649P 505 +102,4,643,645,647,649; 651P 506 +142,0,641,0,651,2; 653P 507 +144,641,1,0,653; 655P 508 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 657P 509 +66.666666667,33.333333333,0.,66.666666667,66.666666667,0.,100.0, 657P 510 +33.333333333,0.,100.0,66.666666667,0.,1.,0.,1.; 657P 511 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,33.333333333, 659P 512 +0.,66.666666667,66.646666667,0.,1.,0.,0.,0.; 659P 513 +110,0.,66.666666667,66.666666667,0.,100.0,66.666666667; 661P 514 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,66.666666667,0., 663P 515 +100.0,33.333333333,0.,1.,0.,0.,0.; 663P 516 +110,0.,66.666666667,33.333333333,0.,100.0,33.333333333; 665P 517 +102,4,659,661,663,665; 667P 518 +142,0,657,0,667,2; 669P 519 +144,657,1,0,669; 671P 520 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0., 673P 521 +66.666666667,0.,0.,100.0,0.,33.333333333,66.666666667,0., 673P 522 +33.333333333,100.0,0.,1.,0.,1.; 673P 523 +110,0.,0.,66.666666667,0.,0.,100.0; 675P 524 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,0.,100.0,0.,33.333333333, 677P 525 +100.0,0.,1.,0.,0.,0.; 677P 526 +110,0.,33.333333333,66.666666667,0.,33.333333333,100.0; 679P 527 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,66.666666667, 681P 528 +0.,0.,66.666666667,0.,1.,0.,0.,0.; 681P 529 +102,4,675,677,679,681; 683P 530 +142,0,673,0,683,2; 685P 531 +144,673,1,0,685; 687P 532 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 689P 533 +33.333333333,66.666666667,0.,33.333333333,100.0,0.,66.666666667, 689P 534 +66.666666667,0.,66.666666667,100.0,0.,1.,0.,1.; 689P 535 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,33.333333333,66.666666667, 691P 536 +0.,33.333333333,100.0,0.,1.,0.,0.,0.; 691P 537 +110,0.,66.666666667,100.0,0.,33.333333333,100.0; 693P 538 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,100.0,0., 695P 539 +66.666666667,66.666666667,0.,1.,0.,0.,0.; 695P 540 +110,0.,66.666666667,66.666666667,0.,33.333333333,66.666666667; 697P 541 +102,4,691,693,695,697; 699P 542 +142,0,689,0,699,2; 701P 543 +144,689,1,0,701; 703P 544 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0., 705P 545 +66.666666667,66.666666667,0.,66.666666667,100.0,0.,100.0, 705P 546 +66.666666667,0.,100.0,100.0,0.,1.,0.,1.; 705P 547 +110,0.,66.666666667,100.0,0.,66.666666667,66.666666667; 707P 548 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,66.666666667,100.0,0., 709P 549 +100.0,100.0,0.,1.,0.,0.,0.; 709P 550 +110,0.,100.0,100.0,0.,100.0,66.666666667; 711P 551 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,0.,100.0,66.666666667,0., 713P 552 +66.686666667,66.666666667,0.,1.,0.,0.,0.; 713P 553 +102,4,707,709,711,713; 715P 554 +142,0,705,0,715,2; 717P 555 +144,705,1,0,717; 719P 556 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 721P 557 +0.,0.,100.0,33.333333333,0.,100.0,0.,33.333333333,100.0, 721P 558 +33.333333333,33.333333333,0.,1.,0.,1.; 721P 559 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,0.,100.0, 723P 560 +33.333333333,0.,0.,1.,0.,0.,0.; 723P 561 +110,100.0,33.333333333,0.,100.0,33.333333333,33.333333333; 725P 562 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,33.333333333, 727P 563 +33.333333333,100.0,0.02,33.333333333,0.,1.,0.,0.,0.; 727P 564 +110,100.0,0.,33.333333333,100.0,0.,0.; 729P 565 +102,4,723,725,727,729; 731P 566 +142,0,721,0,731,2; 733P 567 +144,721,1,0,733; 735P 568 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 737P 569 +0.,33.333333333,100.0,33.333333333,33.333333333,100.0,0., 737P 570 +66.666666667,100.0,33.333333333,66.666666667,0.,1.,0.,1.; 737P 571 +110,100.0,0.,33.333333333,100.0,33.333333333,33.333333333; 739P 572 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,33.333333333, 741P 573 +33.333333333,100.0,33.333333333,66.646666667,0.,1.,0.,0.,0.; 741P 574 +110,100.0,33.333333333,66.666666667,100.0,0.,66.666666667; 743P 575 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,33.333333333,100.0, 745P 576 +0.,66.666666667,0.,1.,0.,0.,0.; 745P 577 +102,4,739,741,743,745; 747P 578 +142,0,737,0,747,2; 749P 579 +144,737,1,0,749; 751P 580 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 753P 581 +0.,66.666666667,100.0,33.333333333,66.666666667,100.0,0.,100.0, 753P 582 +100.0,33.333333333,100.0,0.,1.,0.,1.; 753P 583 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,66.666666667,100.0, 755P 584 +33.313333333,66.666666667,0.,1.,0.,0.,0.; 755P 585 +110,100.0,33.333333333,66.666666667,100.0,33.333333333,100.0; 757P 586 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,0.,100.0,100.0, 759P 587 +33.333333333,100.0,0.,1.,0.,0.,0.; 759P 588 +110,100.0,0.,100.0,100.0,0.,66.666666667; 761P 589 +102,4,755,757,759,761; 763P 590 +142,0,753,0,763,2; 765P 591 +144,753,1,0,765; 767P 592 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 769P 593 +33.333333333,0.,100.0,66.666666667,0.,100.0,33.333333333, 769P 594 +33.333333333,100.0,66.666666667,33.333333333,0.,1.,0.,1.; 769P 595 +110,100.0,33.333333333,0.,100.0,66.666666667,0.; 771P 596 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667, 773P 597 +33.333333333,100.0,66.666666667,0.,0.,1.,0.,0.,0.; 773P 598 +110,100.0,66.666666667,33.333333333,100.0,33.333333333, 775P 599 +33.333333333; 775P 600 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,33.333333333, 777P 601 +33.333333333,100.0,33.333333333,0.,0.,1.,0.,0.,0.; 777P 602 +102,4,771,773,775,777; 779P 603 +142,0,769,0,779,2; 781P 604 +144,769,1,0,781; 783P 605 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 785P 606 +33.333333333,33.333333333,100.0,66.666666667,33.333333333,100.0, 785P 607 +33.333333333,66.666666667,100.0,66.666666667,66.666666667,0.,1., 785P 608 +0.,1.; 785P 609 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667, 787P 610 +33.333333333,100.0,33.333333333,33.333333333,0.,1.,0.,0.,0.; 787P 611 +110,100.0,66.666666667,33.333333333,100.0,66.666666667, 789P 612 +66.666666667; 789P 613 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667, 791P 614 +66.666666667,100.0,33.333333333,66.666666667,0.,1.,0.,0.,0.; 791P 615 +110,100.0,33.333333333,66.666666667,100.0,33.333333333, 793P 616 +33.333333333; 793P 617 +102,4,787,789,791,793; 795P 618 +142,0,785,0,795,2; 797P 619 +144,785,1,0,797; 799P 620 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 801P 621 +33.333333333,66.666666667,100.0,66.666666667,66.666666667,100.0, 801P 622 +33.333333333,100.0,100.0,66.666666667,100.0,0.,1.,0.,1.; 801P 623 +110,100.0,33.333333333,66.666666667,100.0,66.666666667, 803P 624 +66.666666667; 803P 625 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667, 805P 626 +66.666666667,100.0,66.666666667,100.0,0.,1.,0.,0.,0.; 805P 627 +110,100.0,66.666666667,100.0,100.0,33.333333333,100.0; 807P 628 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,33.333333333,100.0, 809P 629 +100.0,33.333333333,66.686666667,0.,1.,0.,0.,0.; 809P 630 +102,4,803,805,807,809; 811P 631 +142,0,801,0,811,2; 813P 632 +144,801,1,0,813; 815P 633 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 817P 634 +66.666666667,0.,100.0,100.0,0.,100.0,66.666666667,33.333333333, 817P 635 +100.0,100.0,33.333333333,0.,1.,0.,1.; 817P 636 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667,0.,100.0, 819P 637 +100.0,0.,0.,1.,0.,0.,0.; 819P 638 +110,100.0,100.0,0.,100.0,100.0,33.333333333; 821P 639 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,33.333333333, 823P 640 +100.0,66.686666667,33.333333333,0.,1.,0.,0.,0.; 823P 641 +110,100.0,66.666666667,0.,100.0,66.666666667,33.333333333; 825P 642 +102,4,819,821,823,825; 827P 643 +142,0,817,0,827,2; 829P 644 +144,817,1,0,829; 831P 645 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 833P 646 +66.666666667,33.333333333,100.0,100.0,33.333333333,100.0, 833P 647 +66.666666667,66.666666667,100.0,100.0,66.666666667,0.,1.,0.,1.; 833P 648 +110,100.0,66.666666667,33.333333333,100.0,100.0,33.333333333; 835P 649 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,33.333333333, 837P 650 +100.0,100.0,66.646666667,0.,1.,0.,0.,0.; 837P 651 +110,100.0,66.666666667,66.666666667,100.0,100.0,66.666666667; 839P 652 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667, 841P 653 +66.666666667,100.0,66.666666667,33.333333333,0.,1.,0.,0.,0.; 841P 654 +102,4,835,837,839,841; 843P 655 +142,0,833,0,843,2; 845P 656 +144,833,1,0,845; 847P 657 +128,1,1,1,1,0,0,1,0,0,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,100.0, 849P 658 +66.666666667,66.666666667,100.0,100.0,66.666666667,100.0, 849P 659 +66.666666667,100.0,100.0,100.0,100.0,0.,1.,0.,1.; 849P 660 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,66.666666667, 851P 661 +66.666666667,100.0,99.98,66.666666667,0.,1.,0.,0.,0.; 851P 662 +110,100.0,100.0,100.0,100.0,100.0,66.666666667; 853P 663 +126,1,1,0,0,1,0,0.,0.,1.,1.,1.,1.,100.0,100.0,100.0,100.0, 855P 664 +66.666666667,100.0,0.,1.,0.,0.,0.; 855P 665 +110,100.0,66.666666667,100.0,100.0,66.666666667,66.666666667; 857P 666 +102,4,851,853,855,857; 859P 667 +142,0,849,0,859,2; 861P 668 +144,849,1,0,861; 863P 669 +S 1G 4D 864P 669 T 1 diff --git a/scripts/generators/prism.py b/scripts/generators/prism.py new file mode 100644 index 0000000..566d824 --- /dev/null +++ b/scripts/generators/prism.py @@ -0,0 +1,393 @@ +"""Planar prism solids written as STEP (AP214) or IGES 5.3 (186 manifold solid B-reps), with +assemblies: STEP next-assembly-usage occurrences placed by item-defined transformations, IGES +subfigure definitions (308) placed by singular subfigure instances (408). + +Standard library only. Every model here is generated from code, so the files are reproducible: +run the model's script and compare the SHA-256 with its README. + +A part is a polygon (counter-clockwise, in the XY plane, millimetres) extruded along +Z by a +height. Faces: bottom, top and one side per polygon edge, all planar, normals outward. +""" + +import math + + +# ---------- geometry ---------- + +def regular(n, r, phase=0.0): + return [(r * math.cos(phase + 2 * math.pi * i / n), r * math.sin(phase + 2 * math.pi * i / n)) for i in range(n)] + + +def rect(w, d): + return [(-w / 2, -d / 2), (w / 2, -d / 2), (w / 2, d / 2), (-w / 2, d / 2)] + + +def l_section(w, d, t): + """An L: a w x d bounding box with legs t thick (not convex).""" + return [(0, 0), (w, 0), (w, t), (t, t), (t, d), (0, d)] + + +def area2(poly): + return sum(poly[i][0] * poly[(i + 1) % len(poly)][1] - poly[(i + 1) % len(poly)][0] * poly[i][1] for i in range(len(poly))) + + +class Part: + def __init__(self, name, poly, height): + if area2(poly) <= 0: + raise ValueError(f"{name}: polygon must be counter-clockwise") + self.name, self.poly, self.h = name, poly, height + + @property + def faces(self): + return len(self.poly) + 2 + + @property + def edges(self): + return 3 * len(self.poly) + + @property + def vertices(self): + return 2 * len(self.poly) + + +# A placement is (rotation 3x3 as rows, translation). Rotations are built from axis angles. + +def rot(axis, deg): + a = math.radians(deg) + c, s = math.cos(a), math.sin(a) + x, y, z = axis + n = math.sqrt(x * x + y * y + z * z) + x, y, z = x / n, y / n, z / n + return [[c + x * x * (1 - c), x * y * (1 - c) - z * s, x * z * (1 - c) + y * s], + [y * x * (1 - c) + z * s, c + y * y * (1 - c), y * z * (1 - c) - x * s], + [z * x * (1 - c) - y * s, z * y * (1 - c) + x * s, c + z * z * (1 - c)]] + + +IDENTITY = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + + +def matmul(a, b): + return [[sum(a[i][k] * b[k][j] for k in range(3)) for j in range(3)] for i in range(3)] + + +class Node: + """An assembly: a name and children (Part or Node), each with a rotation and translation.""" + + def __init__(self, name, children=None): + self.name = name + self.children = children or [] # [(Part | Node, R, t)] + + def add(self, child, R=IDENTITY, t=(0, 0, 0)): + self.children.append((child, R, tuple(t))) + return self + + +def count(node): + """(solid instances, face instances, distinct parts, assembly nodes, occurrences).""" + parts, nodes = set(), set() + def walk(n): + nodes.add(id(n)) + s = f = o = 0 + for c, _, _ in n.children: + o += 1 + if isinstance(c, Part): + parts.add(id(c)); s += 1; f += c.faces + else: + a, b, d = walk(c); s += a; f += b; o += d + return s, f, o + s, f, o = walk(node) + return dict(solids=s, faces=f, distinct_parts=len(parts), assemblies=len(nodes), occurrences=o) + + +def f6(x): + """A real in the shortest form that round-trips at 1e-9 mm, never '-0.'.""" + v = round(x, 9) + if v == 0: + return "0." + s = repr(v) + if "e" in s or "E" in s: + s = f"{v:.12E}" + return s + return s if "." in s else s + "." + + +# ---------- STEP AP214 ---------- + +def step_text(root, file_name, description): + out = [] + + def add(s): + out.append(s) + return len(out) + + def pt(p): + return add(f"CARTESIAN_POINT('',({f6(p[0])},{f6(p[1])},{f6(p[2])}))") + + def dr(d): + return add(f"DIRECTION('',({f6(d[0])},{f6(d[1])},{f6(d[2])}))") + + def ax(o, z, x): + return add(f"AXIS2_PLACEMENT_3D('',#{pt(o)},#{dr(z)},#{dr(x)})") + + # context + mm = add("(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.))") + rad = add("(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.))") + sr = add("(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT())") + unc = add(f"UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-06),#{mm},'distance_accuracy_value','')") + ctx = add(f"(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#{unc}))" + f"GLOBAL_UNIT_ASSIGNED_CONTEXT((#{mm},#{rad},#{sr}))REPRESENTATION_CONTEXT('',''))") + appctx = add("APPLICATION_CONTEXT('core data for automotive mechanical design processes')") + add(f"APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',2000,#{appctx})") + pctx = add(f"PRODUCT_CONTEXT('',#{appctx},'mechanical')") + pdctx = add(f"PRODUCT_DEFINITION_CONTEXT('part definition',#{appctx},'design')") + + def product(name): + p = add(f"PRODUCT('{name}','{name}','',(#{pctx}))") + add(f"PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#{p}))") + f = add(f"PRODUCT_DEFINITION_FORMATION('','',#{p})") + pd = add(f"PRODUCT_DEFINITION('design','',#{f},#{pdctx})") + pds = add(f"PRODUCT_DEFINITION_SHAPE('','',#{pd})") + return pd, pds + + origin = None + + def brep(part): + n, h = len(part.poly), part.h + P = [(x, y, 0.0) for x, y in part.poly] + [(x, y, h) for x, y in part.poly] + V = [add(f"VERTEX_POINT('',#{pt(p)})") for p in P] + + def edge(a, b): + pa, pb = P[a], P[b] + d = [pb[k] - pa[k] for k in range(3)] + L = math.sqrt(sum(x * x for x in d)) + u = [x / L for x in d] + vec = add(f"VECTOR('',#{dr(u)},{f6(L)})") + line = add(f"LINE('',#{pt(pa)},#{vec})") + return add(f"EDGE_CURVE('',#{V[a]},#{V[b]},#{line},.T.)") + + bot = [edge(i, (i + 1) % n) for i in range(n)] + top = [edge(n + i, n + (i + 1) % n) for i in range(n)] + ver = [edge(i, n + i) for i in range(n)] + + def oe(e, fwd): + return f"#{add(f'ORIENTED_EDGE({chr(39)}{chr(39)},*,*,#{e},{'.T.' if fwd else '.F.'})')}" + + def face(oes, o, z, x): + loop = add(f"EDGE_LOOP('',({','.join(oes)}))") + bound = add(f"FACE_OUTER_BOUND('',#{loop},.T.)") + plane = add(f"PLANE('',#{ax(o, z, x)})") + return add(f"ADVANCED_FACE('',(#{bound}),#{plane},.T.)") + + faces = [face([oe(bot[i], False) for i in reversed(range(n))], P[0], (0, 0, -1), (1, 0, 0)), + face([oe(top[i], True) for i in range(n)], P[n], (0, 0, 1), (1, 0, 0))] + for i in range(n): + j = (i + 1) % n + dx, dy = P[j][0] - P[i][0], P[j][1] - P[i][1] + L = math.hypot(dx, dy) + faces.append(face([oe(bot[i], True), oe(ver[j], True), oe(top[i], False), oe(ver[i], False)], + P[i], (dy / L, -dx / L, 0), (dx / L, dy / L, 0))) + shell = add(f"CLOSED_SHELL('',({','.join(f'#{f}' for f in faces)}))") + return add(f"MANIFOLD_SOLID_BREP('{part.name}',#{shell})") + + reps, pds_of = {}, {} + + def define(node): + """Product + shape representation for a part or an assembly (once each).""" + nonlocal origin + if id(node) in reps: + return reps[id(node)] + pd, pds = product(node.name) + o = ax((0, 0, 0), (0, 0, 1), (1, 0, 0)) + if isinstance(node, Part): + rep = add(f"ADVANCED_BREP_SHAPE_REPRESENTATION('{node.name}',(#{o},#{brep(node)}),#{ctx})") + else: + rep = add(f"SHAPE_REPRESENTATION('{node.name}',(#{o}),#{ctx})") + add(f"SHAPE_DEFINITION_REPRESENTATION(#{pds},#{rep})") + reps[id(node)] = (pd, rep, o) + if not isinstance(node, Part): + k = 0 + for child, R, t in node.children: + cpd, crep, co = define(child) + k += 1 + nm = f"{child.name}:{k}" + nauo = add(f"NEXT_ASSEMBLY_USAGE_OCCURRENCE('{nm}','{nm}','',#{pd},#{cpd},$)") + npds = add(f"PRODUCT_DEFINITION_SHAPE('','',#{nauo})") + z = (R[0][2], R[1][2], R[2][2]) + x = (R[0][0], R[1][0], R[2][0]) + tgt = ax(t, z, x) + # the child's origin (in the child's representation) maps to the placement in the parent's + idt = add(f"ITEM_DEFINED_TRANSFORMATION('','',#{co},#{tgt})") + rr = add(f"(REPRESENTATION_RELATIONSHIP('','',#{crep},#{rep})REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#{idt})SHAPE_REPRESENTATION_RELATIONSHIP())") + add(f"CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#{rr},#{npds})") + return reps[id(node)] + + define(root) + head = ("ISO-10303-21;\nHEADER;\n" + f"FILE_DESCRIPTION(('{description}'),'2;1');\n" + f"FILE_NAME('{file_name}','2026-10-20T00:00:00',('raykholo'),(''),'tangency-labs/models generator','python3 scripts/generators','');\n" + "FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));\nENDSEC;\nDATA;\n") + body = "".join(f"#{i + 1}={s};\n" for i, s in enumerate(out)) + return head + body + "ENDSEC;\nEND-ISO-10303-21;\n" + + +# ---------- IGES 5.3 ---------- + +class Iges: + """Directory entries and parameter data, written in fixed 80-column records.""" + + def __init__(self): + self.ents = [] # (type, form, params list, status, matrix_de, label) + + def add(self, typ, params, form=0, status="00000000", matrix=0, label=""): + self.ents.append([typ, form, params, status, matrix, label]) + return 2 * len(self.ents) - 1 # the entity's DE sequence number + + def set_status(self, de, status): + self.ents[(de - 1) // 2][3] = status + + def text(self, file_name, max_coord): + def h(s): + return f"{len(s)}H{s}" + g = [h(","), h(";"), h("tangency-labs/models generator"), h(file_name), h("python3 scripts/generators"), + h("prism.py IGES 5.3"), "32", "38", "6", "308", "15", h(file_name), "1.", "2", h("MM"), "1", "1.", + h("20261020.000000"), "1.E-06", f6(max_coord), h("raykholo"), h(""), "11", "0", h("20261020.000000")] + s_lines = ["Generated by scripts/generators (github.com/tangency-labs/models), CC0"] + + def wrap(items, width, end): + """Join parameters with ',' and end with ';', split into lines of at most width chars.""" + lines, cur = [], "" + for i, it in enumerate(items): + tok = it + (end if i == len(items) - 1 else ",") + if len(cur) + len(tok) > width: + lines.append(cur); cur = "" + cur += tok + lines.append(cur) + return lines + + g_lines = wrap(g, 72, ";") + d_lines, p_lines = [], [] + for idx, (typ, form, params, status, matrix, label) in enumerate(self.ents): + de = 2 * idx + 1 + pl = wrap([str(typ)] + [str(p) for p in params], 64, ";") + start = len(p_lines) + 1 + for line in pl: + p_lines.append(f"{line:<64}{de:>8}") + d_lines.append(f"{typ:>8}{start:>8}{0:>8}{0:>8}{0:>8}{0:>8}{matrix:>8}{0:>8}{status:>8}") + d_lines.append(f"{typ:>8}{0:>8}{0:>8}{len(pl):>8}{form:>8}{'':>8}{'':>8}{label[:8]:>8}{0:>8}") + rec = [] + rec += [f"{l:<72}S{i + 1:>7}" for i, l in enumerate(s_lines)] + rec += [f"{l:<72}G{i + 1:>7}" for i, l in enumerate(g_lines)] + rec += [f"{l:<72}D{i + 1:>7}" for i, l in enumerate(d_lines)] + rec += [f"{l:<72}P{i + 1:>7}" for i, l in enumerate(p_lines)] + rec.append(f"S{len(s_lines):>7}G{len(g_lines):>7}D{len(d_lines):>7}P{len(p_lines):>7}{'':<40}T{1:>7}") + return "\n".join(rec) + "\n" + + +DEP = "00010000" # physically dependent +DEF = "00000200" # independent, used as a definition (subfigure definitions) + + +def iges_solid(ig, part): + """A 186 manifold solid B-rep for the prism; every entity under it is physically dependent.""" + n, hgt = len(part.poly), part.h + P = [(x, y, 0.0) for x, y in part.poly] + [(x, y, hgt) for x, y in part.poly] + vl = ig.add(502, [len(P)] + [f6(c) for p in P for c in p], form=1, status=DEP) + edges = [] # (a, b) vertex indices, 1-based in the vertex list + + def line(a, b): + pa, pb = P[a], P[b] + return ig.add(110, [f6(c) for c in pa + pb], status=DEP) + + E = [(i, (i + 1) % n) for i in range(n)] + [(n + i, n + (i + 1) % n) for i in range(n)] + [(i, n + i) for i in range(n)] + curves = [line(a, b) for a, b in E] + params = [len(E)] + for (a, b), c in zip(E, curves): + params += [c, vl, a + 1, vl, b + 1] + el = ig.add(504, params, form=1, status=DEP) + bot = list(range(n)); top = [n + i for i in range(n)]; ver = [2 * n + i for i in range(n)] + + def loop(es): # [(edge index 0-based, forward)] + p = [len(es)] + for e, fwd in es: + p += [0, el, e + 1, 1 if fwd else 0, 0] + return ig.add(508, p, form=1, status=DEP) + + def plane(o, z): + pt = ig.add(116, [f6(c) for c in o], status=DEP) + dn = ig.add(123, [f6(c) for c in z], status=DEP) + return ig.add(190, [pt, dn], status=DEP) + + def face(es, o, z): + return ig.add(510, [plane(o, z), 1, 1, loop(es)], form=1, status=DEP) + + faces = [face([(bot[i], False) for i in reversed(range(n))], P[0], (0, 0, -1)), + face([(top[i], True) for i in range(n)], P[n], (0, 0, 1))] + for i in range(n): + j = (i + 1) % n + dx, dy = P[j][0] - P[i][0], P[j][1] - P[i][1] + L = math.hypot(dx, dy) + faces.append(face([(bot[i], True), (ver[j], True), (top[i], False), (ver[i], False)], P[i], (dy / L, -dx / L, 0))) + shell = ig.add(514, [len(faces)] + [x for f in faces for x in (f, 1)], form=1, status=DEP) + return ig.add(186, [shell, 1, 0], status=DEP, label=part.name[:8].upper()) + + +def iges_text(root, file_name): + """root: a Node. Every Node becomes a 308 definition (deepest first); every child placement a 408. + The top Node's children are written as independent 408 instances (the file's assembly).""" + ig = Iges() + solid_de, sub_de, depth = {}, {}, {} + + def matrix(R, t): + return ig.add(124, [f6(R[i][j]) if j < 3 else f6(t[i]) for i in range(3) for j in range(4)], status=DEP) + + def part_sub(part): + # a part becomes a one-member subfigure, so every placement is a 408 + if id(part) not in sub_de: + s = iges_solid(ig, part) + sub_de[id(part)] = ig.add(308, [0, f"{len(part.name)}H{part.name}", 1, s], status=DEF) + depth[id(part)] = 0 + return sub_de[id(part)] + + def instance(child, R, t, status): + d = part_sub(child) if isinstance(child, Part) else node_sub(child) + # an unrotated placement uses the 408's own X, Y, Z; a rotated one puts rotation and translation in + # the 408's transformation matrix (124), so both placement mechanisms are exercised (X' = M (S x + T)). + if R == IDENTITY: + return ig.add(408, [d, f6(t[0]), f6(t[1]), f6(t[2]), "1."], status=status) + m = matrix(R, t) + return ig.add(408, [d, "0.", "0.", "0.", "1."], status=status, matrix=m) + + def node_sub(node): + if id(node) not in sub_de: + members = [instance(c, R, t, DEP) for c, R, t in node.children] + dmax = 1 + max(depth[id(c)] for c, _, _ in node.children) + sub_de[id(node)] = ig.add(308, [dmax, f"{len(node.name)}H{node.name}", len(members)] + members, status=DEF) + depth[id(node)] = dmax + return sub_de[id(node)] + + for c, R, t in root.children: + instance(c, R, t, "00000000") + return ig.text(file_name, 1000.0) + + +def expected(root): + """Analytic totals for checking a reader: solid count, total volume (mm3), world bounding box.""" + vol, lo, hi, n = 0.0, [math.inf] * 3, [-math.inf] * 3, 0 + + def walk(node, R, t): + nonlocal vol, n + for c, Rc, tc in node.children: + R2 = matmul(R, Rc) + t2 = [sum(R[i][k] * tc[k] for k in range(3)) + t[i] for i in range(3)] + if isinstance(c, Part): + n += 1 + vol += abs(area2(c.poly)) / 2 * c.h + for x, y in c.poly: + for z in (0.0, c.h): + p = [sum(R2[i][k] * (x, y, z)[k] for k in range(3)) + t2[i] for i in range(3)] + for i in range(3): + lo[i], hi[i] = min(lo[i], p[i]), max(hi[i], p[i]) + else: + walk(c, R2, t2) + walk(root, IDENTITY, [0, 0, 0]) + return dict(solids=n, volume=round(vol, 3), bbox=[round(v, 3) for v in lo + hi]) diff --git a/scripts/generators/trimmed_patch_cube.py b/scripts/generators/trimmed_patch_cube.py new file mode 100644 index 0000000..b163c07 --- /dev/null +++ b/scripts/generators/trimmed_patch_cube.py @@ -0,0 +1,77 @@ +"""iges/trimmed-patch-cube: a closed 100 mm cube given only as trimmed surfaces (144), nine B-spline +patches (128) per side, each trimmed by a curve on surface (142) whose model-space curve is a +composite (102) of line (110) and B-spline (126) pieces. Some trims are written with pieces running +end to start, and some pieces stop 0.02 mm short of the next one, as exporters do. + +There are no solid entities: a reader sews the 54 faces into a closed shell to get a solid. + + python3 scripts/generators/trimmed_patch_cube.py iges/trimmed-patch-cube +""" + +import os +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from prism import DEP, Iges, f6 # noqa: E402 + +L, K = 100.0, 3 # cube size, patches per side along each direction +GAP = 0.02 # how far a shortened trim piece stops before the next, mm + +# the six sides: origin corner, u direction, v direction (u x v points out of the cube) +SIDES = [((0, 0, 0), (0, 1, 0), (1, 0, 0)), # z = 0, normal -Z + ((0, 0, L), (1, 0, 0), (0, 1, 0)), # z = L, normal +Z + ((0, 0, 0), (1, 0, 0), (0, 0, 1)), # y = 0, normal -Y + ((0, L, 0), (0, 0, 1), (1, 0, 0)), # y = L, normal +Y + ((0, 0, 0), (0, 0, 1), (0, 1, 0)), # x = 0, normal -X + ((L, 0, 0), (0, 1, 0), (0, 0, 1))] # x = L, normal +X + + +def at(o, u, v, a, b): + return tuple(o[k] + a * u[k] + b * v[k] for k in range(3)) + + +def cube(): + ig = Iges() + n = 0 + for s, (o, u, v) in enumerate(SIDES): + step = L / K + for i in range(K): + for j in range(K): + n += 1 + c = [at(o, u, v, i * step, j * step), at(o, u, v, (i + 1) * step, j * step), + at(o, u, v, (i + 1) * step, (j + 1) * step), at(o, u, v, i * step, (j + 1) * step)] + # the patch: degree 1 x 1, control points (u-major as IGES orders them: s fastest) + cps = [c[0], c[1], c[3], c[2]] + surf = ig.add(128, [1, 1, 1, 1, 0, 0, 1, 0, 0, "0.", "0.", "1.", "1.", "0.", "0.", "1.", "1.", "1.", "1.", "1.", "1."] + + [f6(x) for p in cps for x in p] + ["0.", "1.", "0.", "1."], status=DEP) + # the trim: four pieces round the patch, counter-clockwise seen from outside + pieces = [] + for e in range(4): + a, b = c[e], c[(e + 1) % 4] + reverse = (n + e) % 5 == 0 # some pieces written end to start + short = (n * 7 + e) % 6 == 0 # some pieces stop GAP before the next + if short: + d = [b[k] - a[k] for k in range(3)] + ln = sum(x * x for x in d) ** 0.5 + b = tuple(b[k] - GAP * d[k] / ln for k in range(3)) + p, q = (b, a) if reverse else (a, b) + if (n + e) % 2: + pieces.append(ig.add(110, [f6(x) for x in p + q], status=DEP)) + else: + # the same straight piece as a degree-1 B-spline (126), knots 0..1 + pieces.append(ig.add(126, [1, 1, 0, 0, 1, 0, "0.", "0.", "1.", "1.", "1.", "1."] + + [f6(x) for x in p + q] + ["0.", "1.", "0.", "0.", "0."], status=DEP)) + comp = ig.add(102, [4] + pieces, status=DEP) + cos = ig.add(142, [0, surf, 0, comp, 2], status=DEP) + ig.add(144, [surf, 1, 0, cos], label=f"S{s}P{i}{j}") + return ig.text("trimmed-patch-cube.igs", L), n + + +if __name__ == "__main__": + out = sys.argv[1] if len(sys.argv) > 1 else "." + os.makedirs(out, exist_ok=True) + path = os.path.join(out, "trimmed-patch-cube.igs") + text, n = cube() + with open(path, "w", newline="\n") as f: + f.write(text) + print(path, dict(faces=n, volume=L ** 3, area=6 * L * L))