Another project
0

Configure Feed

Select the types of activity you want to include in your feed.

rounding out tests & stuff

Lewis: May this revision serve well! <lu5a@proton.me>

author
Lewis
date (Jun 13, 2026, 11:16 PM +0300) commit fb199bf7 parent 25369b1f change-id pnmsstvw
+1303 -5
+65
crates/bone-app/src/main.rs
··· 4603 4603 } 4604 4604 4605 4605 #[test] 4606 + #[cfg_attr( 4607 + debug_assertions, 4608 + ignore = "frame budget assertions are only meaningful in release builds" 4609 + )] 4610 + fn extrude_live_preview_under_frame_budget() { 4611 + use bone_document::ExtrudeEndCondition; 4612 + use bone_types::PositiveLength; 4613 + use std::time::{Duration, Instant}; 4614 + use uom::si::length::millimeter; 4615 + 4616 + const BASE_MM: f64 = 4.0; 4617 + const STEP_MM: f64 = 0.5; 4618 + const STEPS: u32 = 16; 4619 + 4620 + let (document, id) = super::initial_document(rectangle_sketch()); 4621 + let mut cache = super::FeatureCache::new(); 4622 + let blind = |depth_mm: f64| { 4623 + let Ok(depth) = PositiveLength::new(Length::new::<millimeter>(depth_mm)) else { 4624 + panic!("{depth_mm} mm is a positive depth"); 4625 + }; 4626 + ExtrudeFeature { 4627 + end_condition: ExtrudeEndCondition::Blind { depth }, 4628 + ..sketch_mode::default_extrude_feature(id) 4629 + } 4630 + }; 4631 + let edit = |cache: &mut super::FeatureCache, depth_mm: f64| { 4632 + let started = Instant::now(); 4633 + let Some(preview) = super::compute_extrude_preview(cache, &document, blind(depth_mm)) 4634 + else { 4635 + panic!("the rectangle extrudes at {depth_mm} mm"); 4636 + }; 4637 + let Some(solid) = preview.solid() else { 4638 + panic!("the rectangle yields a solid at {depth_mm} mm"); 4639 + }; 4640 + let Ok(_view) = super::build_solid_view(solid) else { 4641 + panic!("the slab tessellates and packs scenes at {depth_mm} mm"); 4642 + }; 4643 + started.elapsed() 4644 + }; 4645 + 4646 + let _warmup = edit(&mut cache, BASE_MM); 4647 + let durations: Vec<Duration> = (0..STEPS) 4648 + .map(|i| edit(&mut cache, BASE_MM + STEP_MM * f64::from(i))) 4649 + .collect(); 4650 + let sorted = { 4651 + let mut v = durations.clone(); 4652 + v.sort(); 4653 + v 4654 + }; 4655 + let median = sorted[sorted.len() / 2]; 4656 + let Some(&worst) = sorted.last() else { 4657 + panic!("preview loop produced zero samples"); 4658 + }; 4659 + let budget = BudgetCeiling::FRAME_16MS.duration(); 4660 + assert!( 4661 + median <= budget, 4662 + "median evaluate+tessellate+scene step {median:?} exceeds {budget:?} frame budget; samples {durations:?}", 4663 + ); 4664 + assert!( 4665 + worst <= budget * 2, 4666 + "worst evaluate+tessellate+scene step {worst:?} exceeds the relaxed ceiling; samples {durations:?}", 4667 + ); 4668 + } 4669 + 4670 + #[test] 4606 4671 fn extrude_preview_absent_when_sketch_missing() { 4607 4672 let document = Document::new(DocumentId::default(), "Empty".to_owned()); 4608 4673 let feature = sketch_mode::default_extrude_feature(SketchId::default());
+286
crates/bone-app/src/shell.rs
··· 5579 5579 tree_reachable.len() 5580 5580 ); 5581 5581 } 5582 + 5583 + fn isometric_camera() -> Camera3 { 5584 + use bone_types::{Point3, Projection, UnitVec3}; 5585 + use uom::si::{f64::Length as UomLength, length::millimeter}; 5586 + let Ok(projection) = Projection::orthographic(UomLength::new::<millimeter>(2.0)) else { 5587 + unreachable!("a positive half height yields a projection"); 5588 + }; 5589 + let Ok(camera) = Camera3::new( 5590 + Point3::from_mm(10.0, 10.0, 10.0), 5591 + Point3::origin(), 5592 + UnitVec3::z_axis(), 5593 + projection, 5594 + ) else { 5595 + unreachable!("a non-degenerate isometric camera"); 5596 + }; 5597 + camera 5598 + } 5599 + 5600 + fn render_phase2( 5601 + size: LayoutSize, 5602 + strings: &StringTable, 5603 + document: &Document, 5604 + mode: &Mode, 5605 + camera3: Option<Camera3>, 5606 + configure: impl FnOnce(&mut Shell), 5607 + ) -> (ShellFrame, accesskit::TreeUpdate) { 5608 + let mut shell = Shell::new(); 5609 + configure(&mut shell); 5610 + let theme = Arc::new(Theme::light()); 5611 + let hk = HotkeyTable::new(); 5612 + let mut focus = FocusManager::new(); 5613 + let mut hits = HitFrame::new(); 5614 + let prev = HitState::new(); 5615 + let mut input = InputSnapshot::idle(FrameInstant::ZERO); 5616 + let mut shaper = bone_text::Shaper::new(); 5617 + let mut a11y = AccessTreeBuilder::new(); 5618 + let mut view = ViewUi::default(); 5619 + let frame = { 5620 + let mut ctx = FrameCtx::new( 5621 + Arc::clone(&theme), 5622 + &mut input, 5623 + &mut focus, 5624 + &hk, 5625 + strings, 5626 + &mut hits, 5627 + &prev, 5628 + &mut a11y, 5629 + &mut shaper, 5630 + ); 5631 + shell.render( 5632 + &mut ctx, 5633 + document, 5634 + mode, 5635 + &Selection::default(), 5636 + &Settings::default(), 5637 + size, 5638 + None, 5639 + camera3, 5640 + None, 5641 + &mut view, 5642 + ) 5643 + }; 5644 + let update = a11y.build(strings, focus.focused()); 5645 + (frame, update) 5646 + } 5647 + 5648 + fn any_label_rect(frame: &ShellFrame, key: StringKey) -> Option<LayoutRect> { 5649 + label_rect(&frame.paints, key).or_else(|| label_rect(&frame.overlay_paints, key)) 5650 + } 5651 + 5652 + #[test] 5653 + fn rtl_mirrors_extrude_property_pane() { 5654 + let size = layout_size(1600.0, 900.0); 5655 + let doc = sample_document(); 5656 + let mode = Mode::Extrude(ExtrudeArming::profile(SketchId::default())); 5657 + let ltr = render_phase2( 5658 + size, 5659 + &crate::strings::make_strings(Locale::EnUs), 5660 + &doc, 5661 + &mode, 5662 + None, 5663 + |_| {}, 5664 + ) 5665 + .0; 5666 + let rtl = render_phase2( 5667 + size, 5668 + &crate::strings::make_strings(Locale::ArXb), 5669 + &doc, 5670 + &mode, 5671 + None, 5672 + |_| {}, 5673 + ) 5674 + .0; 5675 + let key = strings::PROPERTY_ROW_EXTRUDE_DEPTH; 5676 + let ltr_rect = 5677 + any_label_rect(&ltr, key).unwrap_or_else(|| panic!("ltr extrude depth row missing")); 5678 + let rtl_rect = 5679 + any_label_rect(&rtl, key).unwrap_or_else(|| panic!("rtl extrude depth row missing")); 5680 + let half = size.width.value() * 0.5; 5681 + assert!( 5682 + ltr_rect.origin.x.value() < half, 5683 + "extrude depth row sits on the left half under ltr, got x={}", 5684 + ltr_rect.origin.x.value(), 5685 + ); 5686 + assert!( 5687 + rtl_rect.origin.x.value() > half, 5688 + "extrude depth row mirrors to the right half under rtl, got x={}", 5689 + rtl_rect.origin.x.value(), 5690 + ); 5691 + } 5692 + 5693 + #[test] 5694 + fn rtl_mirrors_file_menu_import_item() { 5695 + let size = layout_size(1600.0, 900.0); 5696 + let doc = sample_document(); 5697 + let open_file = |s: &mut Shell| s.state.menu_bar.open = Some(s.ids.menu_file); 5698 + let ltr = render_phase2( 5699 + size, 5700 + &crate::strings::make_strings(Locale::EnUs), 5701 + &doc, 5702 + &Mode::Idle, 5703 + None, 5704 + open_file, 5705 + ) 5706 + .0; 5707 + let rtl = render_phase2( 5708 + size, 5709 + &crate::strings::make_strings(Locale::ArXb), 5710 + &doc, 5711 + &Mode::Idle, 5712 + None, 5713 + open_file, 5714 + ) 5715 + .0; 5716 + let key = strings::MENU_FILE_IMPORT; 5717 + let ltr_rect = 5718 + any_label_rect(&ltr, key).unwrap_or_else(|| panic!("ltr file import item missing")); 5719 + let rtl_rect = 5720 + any_label_rect(&rtl, key).unwrap_or_else(|| panic!("rtl file import item missing")); 5721 + let half = size.width.value() * 0.5; 5722 + assert!( 5723 + ltr_rect.origin.x.value() < half, 5724 + "file import item opens on the left under ltr, got x={}", 5725 + ltr_rect.origin.x.value(), 5726 + ); 5727 + assert!( 5728 + rtl_rect.origin.x.value() > half, 5729 + "file import item mirrors to the right under rtl, got x={}", 5730 + rtl_rect.origin.x.value(), 5731 + ); 5732 + } 5733 + 5734 + fn cube_group_x0(update: &accesskit::TreeUpdate, cube: WidgetId) -> f64 { 5735 + let nid = bone_ui::a11y::widget_node_id(cube); 5736 + update 5737 + .nodes 5738 + .iter() 5739 + .find_map(|(id, node)| (*id == nid).then(|| node.bounds()).flatten()) 5740 + .unwrap_or_else(|| panic!("view cube group must render")) 5741 + .x0 5742 + } 5743 + 5744 + #[test] 5745 + fn rtl_flips_view_cube_with_the_viewport() { 5746 + let size = layout_size(1600.0, 900.0); 5747 + let doc = sample_document(); 5748 + let cube = Shell::new().ids.view_cube; 5749 + let (_, ltr) = render_phase2( 5750 + size, 5751 + &crate::strings::make_strings(Locale::EnUs), 5752 + &doc, 5753 + &Mode::Idle, 5754 + Some(isometric_camera()), 5755 + |_| {}, 5756 + ); 5757 + let (_, rtl) = render_phase2( 5758 + size, 5759 + &crate::strings::make_strings(Locale::ArXb), 5760 + &doc, 5761 + &Mode::Idle, 5762 + Some(isometric_camera()), 5763 + |_| {}, 5764 + ); 5765 + let ltr_x0 = cube_group_x0(&ltr, cube); 5766 + let rtl_x0 = cube_group_x0(&rtl, cube); 5767 + assert!( 5768 + ltr_x0 > rtl_x0, 5769 + "view cube follows the viewport across rtl: ltr x0={ltr_x0}, rtl x0={rtl_x0}", 5770 + ); 5771 + } 5772 + 5773 + fn extrude_property_rows() -> Vec<(WidgetId, &'static str)> { 5774 + [ 5775 + "end", 5776 + "depth", 5777 + "draft", 5778 + "draft_angle", 5779 + "direction_two", 5780 + "thin", 5781 + "merge", 5782 + ] 5783 + .into_iter() 5784 + .map(|key| { 5785 + ( 5786 + WidgetId::ROOT 5787 + .child(WidgetKey::new("props.extrude")) 5788 + .child(WidgetKey::new(key)), 5789 + key, 5790 + ) 5791 + }) 5792 + .collect() 5793 + } 5794 + 5795 + fn visible_cube_faces(ids: &ShellIds) -> Vec<(WidgetId, &'static str)> { 5796 + use crate::view_cube::{CubeCell, cell_widget_id}; 5797 + [ 5798 + (bone_types::StandardView::Top, "view_cube.top"), 5799 + (bone_types::StandardView::Right, "view_cube.right"), 5800 + (bone_types::StandardView::Back, "view_cube.back"), 5801 + ] 5802 + .into_iter() 5803 + .map(|(view, name)| { 5804 + let cell = CubeCell::all() 5805 + .into_iter() 5806 + .find(|c| c.standard_view() == Some(view)) 5807 + .unwrap_or_else(|| panic!("{name} names a cube face")); 5808 + (cell_widget_id(ids.view_cube, cell), name) 5809 + }) 5810 + .collect() 5811 + } 5812 + 5813 + #[test] 5814 + fn a11y_smoke_post_extrude_surface_is_reachable_and_named() { 5815 + let table = crate::strings::make_strings(Locale::EnUs); 5816 + let canvas = layout_size(3600.0, 900.0); 5817 + let ids = Shell::new().ids; 5818 + 5819 + let (doc, extrude_id) = document_with_extrude(); 5820 + 5821 + let (_, tree_update) = render_phase2( 5822 + canvas, 5823 + &table, 5824 + &doc, 5825 + &Mode::Idle, 5826 + Some(isometric_camera()), 5827 + |s| { 5828 + s.state.left_pane = LeftPane::Tree; 5829 + s.state.ribbon_active_tab = Some(features_tab_id(s.ids.ribbon)); 5830 + }, 5831 + ); 5832 + 5833 + let (_, pane_update) = render_phase2( 5834 + canvas, 5835 + &table, 5836 + &doc, 5837 + &Mode::Extrude(ExtrudeArming::profile(SketchId::default())), 5838 + Some(isometric_camera()), 5839 + |_| {}, 5840 + ); 5841 + 5842 + let (_, menu_update) = render_phase2(canvas, &table, &doc, &Mode::Idle, None, |s| { 5843 + s.state.menu_bar.open = Some(s.ids.menu_file); 5844 + s.state.menu_bar.menu.open_submenu = Some(s.ids.menu_file_export); 5845 + }); 5846 + 5847 + let (reachable, nodes) = 5848 + union_reachable([&tree_update, &pane_update, &menu_update].into_iter()); 5849 + 5850 + let ribbon_buttons = FeatureTool::ALL 5851 + .iter() 5852 + .map(|t| (feature_tool_widget_id(ids.ribbon, *t), feature_tool_key(*t))); 5853 + let extrude_row = 5854 + std::iter::once((extrude_widget(&ids, extrude_id), "feature_tree.extrude")); 5855 + let file_menu_items = [ 5856 + (ids.menu_file_import, "menu.file.import"), 5857 + (ids.menu_file_export, "menu.file.export"), 5858 + (ids.menu_file_export_step, "menu.file.export.step"), 5859 + ]; 5860 + 5861 + let expected = ribbon_buttons 5862 + .chain(extrude_row) 5863 + .chain(extrude_property_rows()) 5864 + .chain(visible_cube_faces(&ids)) 5865 + .chain(file_menu_items); 5866 + assert_widgets_reachable_and_labeled(expected, &reachable, &nodes); 5867 + } 5582 5868 }
+7 -2
crates/bone-app/src/view_cube.rs
··· 126 126 } 127 127 } 128 128 129 + #[must_use] 130 + pub fn cell_widget_id(base: WidgetId, cell: CubeCell) -> WidgetId { 131 + base.child_indexed(WidgetKey::new("cell"), cell.index()) 132 + } 133 + 129 134 #[derive(Copy, Clone, Debug, PartialEq)] 130 135 pub enum ViewPick { 131 136 Standard(StandardView), ··· 489 494 let mut hovered: Option<(CubeCell, LayoutRect)> = None; 490 495 let mut labels: Vec<(LayoutRect, StringKey, Color)> = Vec::new(); 491 496 placements.iter().for_each(|place| { 492 - let id = base.child_indexed(WidgetKey::new("cell"), place.cell.index()); 497 + let id = cell_widget_id(base, place.cell); 493 498 let interaction = ctx.interact( 494 499 InteractDeclaration::new(id, place.pick_rect, Sense::INTERACTIVE) 495 500 .a11y(AccessNode::new(Role::Button).with_label(place.cell.a11y_label())), ··· 513 518 }); 514 519 }); 515 520 if let Some((cell, rect)) = hovered { 516 - let id = base.child_indexed(WidgetKey::new("cell"), cell.index()); 521 + let id = cell_widget_id(base, cell); 517 522 let tip = show_tooltip( 518 523 ctx, 519 524 Tooltip::new(
+158 -3
crates/bone-document/tests/folder_jj.rs
··· 1 1 use std::process::Command; 2 2 3 3 use bone_document::{ 4 - DimensionKind, Document, DocumentFolder, EditOutcome, Sketch, SketchDimension, SketchEdit, 5 - SketchEntity, load, save, 4 + BlobKind, DimensionKind, Document, DocumentFolder, EditOutcome, Sketch, SketchDimension, 5 + SketchEdit, SketchEntity, evaluate_extrude, evaluate_sketch, load, save, write_solid, 6 + }; 7 + use bone_kernel::{ 8 + BrepSolid, ExtrudeDirection, ExtrudeEndCondition, ExtrudeFeature, ExtrudeSense, MergeResult, 6 9 }; 7 10 use bone_types::{ 8 - DocumentId, Length, Point2, Point3, SketchId, SketchPlaneBasis, Tolerance, UnitVec3, millimeter, 11 + DocumentId, ExtrudeId, Length, Point2, Point3, PositiveLength, SketchId, SketchPlaneBasis, 12 + Tolerance, UnitVec3, millimeter, 9 13 }; 10 14 use slotmap::KeyData; 11 15 use tempfile::{TempDir, tempdir}; ··· 176 180 "expected no binary diff:\n{diff}" 177 181 ); 178 182 } 183 + 184 + fn extrude_id(idx: u32) -> ExtrudeId { 185 + ExtrudeId::from(KeyData::from_ffi((1u64 << 32) | u64::from(idx))) 186 + } 187 + 188 + fn add_point(s: Sketch, x: f64, y: f64) -> (Sketch, bone_types::SketchEntityId) { 189 + let Ok((next, EditOutcome::Entity(id))) = s.apply(SketchEdit::AddEntity(SketchEntity::point( 190 + Point2::from_mm(x, y), 191 + ))) else { 192 + panic!("add point"); 193 + }; 194 + (next, id) 195 + } 196 + 197 + fn closed_rectangle() -> Sketch { 198 + let s = Sketch::new(plane()); 199 + let (s, p0) = add_point(s, 0.0, 0.0); 200 + let (s, p1) = add_point(s, 10.0, 0.0); 201 + let (s, p2) = add_point(s, 10.0, 5.0); 202 + let (s, p3) = add_point(s, 0.0, 5.0); 203 + [(p0, p1), (p1, p2), (p2, p3), (p3, p0)] 204 + .into_iter() 205 + .fold(s, |s, (a, b)| { 206 + let Ok((next, _)) = s.apply(SketchEdit::AddEntity(SketchEntity::line(a, b, false))) 207 + else { 208 + panic!("rectangle edge"); 209 + }; 210 + next 211 + }) 212 + } 213 + 214 + fn blind_extrude(sketch: SketchId, depth_mm: f64) -> ExtrudeFeature { 215 + let Ok(depth) = PositiveLength::new(mm(depth_mm)) else { 216 + panic!("positive depth"); 217 + }; 218 + ExtrudeFeature { 219 + sketch, 220 + direction: ExtrudeDirection::Normal { 221 + sense: ExtrudeSense::Forward, 222 + }, 223 + end_condition: ExtrudeEndCondition::Blind { depth }, 224 + draft: None, 225 + thin_wall: None, 226 + merge_result: MergeResult::Merge, 227 + } 228 + } 229 + 230 + fn evaluated_solid(doc: &Document, sketch: SketchId, extrude: ExtrudeId) -> BrepSolid { 231 + let Some(sketch_value) = doc.sketch(sketch) else { 232 + panic!("sketch present"); 233 + }; 234 + let Some(feature_id) = doc.feature_tree().feature_of_extrude(extrude) else { 235 + panic!("extrude node present"); 236 + }; 237 + let Some(&feature) = doc.extrude_of_feature(feature_id) else { 238 + panic!("extrude feature present"); 239 + }; 240 + let evaluated = evaluate_sketch(sketch_value); 241 + let extruded = evaluate_extrude(feature_id, &evaluated, &feature); 242 + let Some(solid) = extruded.solid() else { 243 + panic!("rectangle extrudes to a solid"); 244 + }; 245 + solid.clone() 246 + } 247 + 248 + #[test] 249 + fn jj_diff_on_extrude_edit_is_text_only() { 250 + if !jj_available() { 251 + eprintln!("skip: jj not on PATH"); 252 + return; 253 + } 254 + 255 + let dir = ok_dir(); 256 + let folder = DocumentFolder::new(dir.path().join("slab.bone")); 257 + let sid = sketch_id(1); 258 + let eid = extrude_id(1); 259 + 260 + let mut doc = Document::new(document_id(1), "slab".to_owned()); 261 + doc.insert_sketch(sid, "Sketch1".to_owned(), closed_rectangle()); 262 + doc.insert_extrude(eid, blind_extrude(sid, 10.0)); 263 + assert_save(&doc, &folder); 264 + let Ok(_baseline_blob) = write_solid(&folder, &evaluated_solid(&doc, sid, eid)) else { 265 + panic!("cache the depth-10 solid"); 266 + }; 267 + 268 + run(Command::new("jj") 269 + .arg("git") 270 + .arg("init") 271 + .arg("--colocate") 272 + .current_dir(folder.path())); 273 + run(Command::new("jj") 274 + .arg("config") 275 + .arg("set") 276 + .arg("--repo") 277 + .arg("user.name") 278 + .arg("test") 279 + .current_dir(folder.path())); 280 + run(Command::new("jj") 281 + .arg("config") 282 + .arg("set") 283 + .arg("--repo") 284 + .arg("user.email") 285 + .arg("test@example.com") 286 + .current_dir(folder.path())); 287 + run(Command::new("jj") 288 + .arg("describe") 289 + .arg("--message") 290 + .arg("initial") 291 + .current_dir(folder.path())); 292 + run(Command::new("jj").arg("new").current_dir(folder.path())); 293 + 294 + let document_before = std::fs::read_to_string(folder.document_file()).unwrap_or_default(); 295 + 296 + let mut next = assert_load(&folder); 297 + next.insert_extrude(eid, blind_extrude(sid, 14.0)); 298 + assert_save(&next, &folder); 299 + let Ok(edited_blob) = write_solid(&folder, &evaluated_solid(&next, sid, eid)) else { 300 + panic!("cache the depth-14 solid"); 301 + }; 302 + 303 + let document_after = std::fs::read_to_string(folder.document_file()).unwrap_or_default(); 304 + assert_eq!( 305 + document_before, document_after, 306 + "an extrude-depth edit must not churn document.ron; geometry is not in the recipe" 307 + ); 308 + assert!( 309 + folder.blob_path(edited_blob, BlobKind::BREP).exists(), 310 + "the widened slab content-addresses a fresh brep blob" 311 + ); 312 + 313 + let diff = run(Command::new("jj") 314 + .arg("diff") 315 + .arg("--git") 316 + .current_dir(folder.path())); 317 + assert!( 318 + diff.contains("extrudes/"), 319 + "expected the extrude file in the diff:\n{diff}" 320 + ); 321 + assert!( 322 + diff.contains(".brep"), 323 + "expected a new geometry blob in the diff:\n{diff}" 324 + ); 325 + assert!( 326 + diff.contains('+') && diff.contains('-'), 327 + "expected text diff markers:\n{diff}" 328 + ); 329 + assert!( 330 + !diff.contains("Binary files"), 331 + "expected no binary diff:\n{diff}" 332 + ); 333 + }
+260
crates/bone-interop/tests/goldens/cylinder.step
··· 1 + ISO-10303-21; 2 + HEADER; 3 + FILE_DESCRIPTION(('Bone geometry'),'2;1'); 4 + FILE_NAME('cylinder','1970-01-01T00:00:00',(''),(''),'','Bone 0.0.0',''); 5 + FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 6 + ENDSEC; 7 + DATA; 8 + #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 'automotive_design', 2000, #2); 9 + #2 = APPLICATION_CONTEXT('core data for automotive mechanical design processes'); 10 + #3 = SHAPE_DEFINITION_REPRESENTATION(#4, #10); 11 + #4 = PRODUCT_DEFINITION_SHAPE('','', #5); 12 + #5 = PRODUCT_DEFINITION('design','', #6, #9); 13 + #6 = PRODUCT_DEFINITION_FORMATION('','', #7); 14 + #7 = PRODUCT('','','', (#8)); 15 + #8 = PRODUCT_CONTEXT('', #2, 'mechanical'); 16 + #9 = PRODUCT_DEFINITION_CONTEXT('part definition', #2, 'design'); 17 + #10 = ADVANCED_BREP_SHAPE_REPRESENTATION('', (#16), #11); 18 + #11 = ( 19 + GEOMETRIC_REPRESENTATION_CONTEXT(3) 20 + GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#15)) 21 + GLOBAL_UNIT_ASSIGNED_CONTEXT((#12, #13, #14)) 22 + REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') 23 + ); 24 + #12 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 25 + #13 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 26 + #14 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 27 + #15 = UNCERTAINTY_MEASURE_WITH_UNIT(1.0E-6, #12, 'distance_accuracy_value','confusion accuracy'); 28 + #16 = MANIFOLD_SOLID_BREP('', #17); 29 + #17 = CLOSED_SHELL('', (#18, #24, #31, #38, #45)); 30 + #18 = FACE_SURFACE('', (#19), #66, .F.); 31 + #19 = FACE_BOUND('', #20, .F.); 32 + #20 = EDGE_LOOP('', (#21, #22, #23)); 33 + #21 = ORIENTED_EDGE('', *, *, #51, .T.); 34 + #22 = ORIENTED_EDGE('', *, *, #52, .T.); 35 + #23 = ORIENTED_EDGE('', *, *, #53, .T.); 36 + #24 = FACE_SURFACE('', (#25), #71, .T.); 37 + #25 = FACE_BOUND('', #26, .T.); 38 + #26 = EDGE_LOOP('', (#27, #28, #29, #30)); 39 + #27 = ORIENTED_EDGE('', *, *, #51, .T.); 40 + #28 = ORIENTED_EDGE('', *, *, #54, .T.); 41 + #29 = ORIENTED_EDGE('', *, *, #55, .F.); 42 + #30 = ORIENTED_EDGE('', *, *, #56, .F.); 43 + #31 = FACE_SURFACE('', (#32), #84, .T.); 44 + #32 = FACE_BOUND('', #33, .T.); 45 + #33 = EDGE_LOOP('', (#34, #35, #36, #37)); 46 + #34 = ORIENTED_EDGE('', *, *, #52, .T.); 47 + #35 = ORIENTED_EDGE('', *, *, #57, .T.); 48 + #36 = ORIENTED_EDGE('', *, *, #58, .F.); 49 + #37 = ORIENTED_EDGE('', *, *, #54, .F.); 50 + #38 = FACE_SURFACE('', (#39), #97, .T.); 51 + #39 = FACE_BOUND('', #40, .T.); 52 + #40 = EDGE_LOOP('', (#41, #42, #43, #44)); 53 + #41 = ORIENTED_EDGE('', *, *, #53, .T.); 54 + #42 = ORIENTED_EDGE('', *, *, #56, .T.); 55 + #43 = ORIENTED_EDGE('', *, *, #59, .F.); 56 + #44 = ORIENTED_EDGE('', *, *, #57, .F.); 57 + #45 = FACE_SURFACE('', (#46), #110, .T.); 58 + #46 = FACE_BOUND('', #47, .T.); 59 + #47 = EDGE_LOOP('', (#48, #49, #50)); 60 + #48 = ORIENTED_EDGE('', *, *, #55, .T.); 61 + #49 = ORIENTED_EDGE('', *, *, #58, .T.); 62 + #50 = ORIENTED_EDGE('', *, *, #59, .T.); 63 + #51 = EDGE_CURVE('', #60, #61, #115, .T.); 64 + #52 = EDGE_CURVE('', #61, #62, #122, .T.); 65 + #53 = EDGE_CURVE('', #62, #60, #129, .T.); 66 + #54 = EDGE_CURVE('', #61, #63, #136, .T.); 67 + #55 = EDGE_CURVE('', #64, #63, #140, .T.); 68 + #56 = EDGE_CURVE('', #60, #64, #147, .T.); 69 + #57 = EDGE_CURVE('', #62, #65, #151, .T.); 70 + #58 = EDGE_CURVE('', #63, #65, #155, .T.); 71 + #59 = EDGE_CURVE('', #65, #64, #162, .T.); 72 + #60 = VERTEX_POINT('', #169); 73 + #61 = VERTEX_POINT('', #170); 74 + #62 = VERTEX_POINT('', #171); 75 + #63 = VERTEX_POINT('', #172); 76 + #64 = VERTEX_POINT('', #173); 77 + #65 = VERTEX_POINT('', #174); 78 + #66 = PLANE('', #67); 79 + #67 = AXIS2_PLACEMENT_3D('', #68, #69, #70); 80 + #68 = CARTESIAN_POINT('', (5.0, 5.051814855409225, 0.0)); 81 + #69 = DIRECTION('', (0.0, 0.0, 1.0)); 82 + #70 = DIRECTION('', (-1.0, 0.0, 0.0)); 83 + #71 = ( 84 + BOUNDED_SURFACE() 85 + B_SPLINE_SURFACE(2, 1, ((#72, #73), (#74, #75), (#76, #77), (#78, #79), (#80, #81), (#82, #83)), .UNSPECIFIED., .U., .U., .U.) 86 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 87 + GEOMETRIC_REPRESENTATION_ITEM() 88 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) 89 + REPRESENTATION_ITEM('') 90 + SURFACE() 91 + ); 92 + #72 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); 93 + #73 = CARTESIAN_POINT('', (5.0, 0.0, 10.0)); 94 + #74 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 0.0)); 95 + #75 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 10.0)); 96 + #76 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 0.0)); 97 + #77 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 10.0)); 98 + #78 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 0.0)); 99 + #79 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 10.0)); 100 + #80 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 0.0)); 101 + #81 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 10.0)); 102 + #82 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 0.0)); 103 + #83 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 10.0)); 104 + #84 = ( 105 + BOUNDED_SURFACE() 106 + B_SPLINE_SURFACE(2, 1, ((#85, #86), (#87, #88), (#89, #90), (#91, #92), (#93, #94), (#95, #96)), .UNSPECIFIED., .U., .U., .U.) 107 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 108 + GEOMETRIC_REPRESENTATION_ITEM() 109 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) 110 + REPRESENTATION_ITEM('') 111 + SURFACE() 112 + ); 113 + #85 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); 114 + #86 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 10.0)); 115 + #87 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 0.0)); 116 + #88 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 10.0)); 117 + #89 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 0.0)); 118 + #90 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 10.0)); 119 + #91 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 0.0)); 120 + #92 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 10.0)); 121 + #93 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 0.0)); 122 + #94 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 10.0)); 123 + #95 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 0.0)); 124 + #96 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 10.0)); 125 + #97 = ( 126 + BOUNDED_SURFACE() 127 + B_SPLINE_SURFACE(2, 1, ((#98, #99), (#100, #101), (#102, #103), (#104, #105), (#106, #107), (#108, #109)), .UNSPECIFIED., .U., .U., .U.) 128 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 129 + GEOMETRIC_REPRESENTATION_ITEM() 130 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) 131 + REPRESENTATION_ITEM('') 132 + SURFACE() 133 + ); 134 + #98 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); 135 + #99 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 10.0)); 136 + #100 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 0.0)); 137 + #101 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 10.0)); 138 + #102 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 0.0)); 139 + #103 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 10.0)); 140 + #104 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 0.0)); 141 + #105 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 10.0)); 142 + #106 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 0.0)); 143 + #107 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 10.0)); 144 + #108 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 0.0)); 145 + #109 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 10.0)); 146 + #110 = PLANE('', #111); 147 + #111 = AXIS2_PLACEMENT_3D('', #112, #113, #114); 148 + #112 = CARTESIAN_POINT('', (5.0, 5.051814855409225, 10.0)); 149 + #113 = DIRECTION('', (0.0, 0.0, 1.0)); 150 + #114 = DIRECTION('', (-1.0, 0.0, 0.0)); 151 + #115 = ( 152 + BOUNDED_CURVE() 153 + B_SPLINE_CURVE(2, (#116, #117, #118, #119, #120, #121), .UNSPECIFIED., .U., .U.) 154 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 155 + CURVE() 156 + GEOMETRIC_REPRESENTATION_ITEM() 157 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 158 + REPRESENTATION_ITEM('') 159 + ); 160 + #116 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); 161 + #117 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 0.0)); 162 + #118 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 0.0)); 163 + #119 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 0.0)); 164 + #120 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 0.0)); 165 + #121 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 0.0)); 166 + #122 = ( 167 + BOUNDED_CURVE() 168 + B_SPLINE_CURVE(2, (#123, #124, #125, #126, #127, #128), .UNSPECIFIED., .U., .U.) 169 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 170 + CURVE() 171 + GEOMETRIC_REPRESENTATION_ITEM() 172 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 173 + REPRESENTATION_ITEM('') 174 + ); 175 + #123 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); 176 + #124 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 0.0)); 177 + #125 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 0.0)); 178 + #126 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 0.0)); 179 + #127 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 0.0)); 180 + #128 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 0.0)); 181 + #129 = ( 182 + BOUNDED_CURVE() 183 + B_SPLINE_CURVE(2, (#130, #131, #132, #133, #134, #135), .UNSPECIFIED., .U., .U.) 184 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 185 + CURVE() 186 + GEOMETRIC_REPRESENTATION_ITEM() 187 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 188 + REPRESENTATION_ITEM('') 189 + ); 190 + #130 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); 191 + #131 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 0.0)); 192 + #132 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 0.0)); 193 + #133 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 0.0)); 194 + #134 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 0.0)); 195 + #135 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 0.0)); 196 + #136 = LINE('', #137, #138); 197 + #137 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); 198 + #138 = VECTOR('', #139, 10.0); 199 + #139 = DIRECTION('', (0.0, 0.0, 1.0)); 200 + #140 = ( 201 + BOUNDED_CURVE() 202 + B_SPLINE_CURVE(2, (#141, #142, #143, #144, #145, #146), .UNSPECIFIED., .U., .U.) 203 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 204 + CURVE() 205 + GEOMETRIC_REPRESENTATION_ITEM() 206 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 207 + REPRESENTATION_ITEM('') 208 + ); 209 + #141 = CARTESIAN_POINT('', (5.0, 0.0, 10.0)); 210 + #142 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 10.0)); 211 + #143 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 10.0)); 212 + #144 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 10.0)); 213 + #145 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 10.0)); 214 + #146 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 10.0)); 215 + #147 = LINE('', #148, #149); 216 + #148 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); 217 + #149 = VECTOR('', #150, 10.0); 218 + #150 = DIRECTION('', (0.0, 0.0, 1.0)); 219 + #151 = LINE('', #152, #153); 220 + #152 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); 221 + #153 = VECTOR('', #154, 10.0); 222 + #154 = DIRECTION('', (0.0, 0.0, 1.0)); 223 + #155 = ( 224 + BOUNDED_CURVE() 225 + B_SPLINE_CURVE(2, (#156, #157, #158, #159, #160, #161), .UNSPECIFIED., .U., .U.) 226 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 227 + CURVE() 228 + GEOMETRIC_REPRESENTATION_ITEM() 229 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 230 + REPRESENTATION_ITEM('') 231 + ); 232 + #156 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 10.0)); 233 + #157 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 10.0)); 234 + #158 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 10.0)); 235 + #159 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 10.0)); 236 + #160 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 10.0)); 237 + #161 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 10.0)); 238 + #162 = ( 239 + BOUNDED_CURVE() 240 + B_SPLINE_CURVE(2, (#163, #164, #165, #166, #167, #168), .UNSPECIFIED., .U., .U.) 241 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 242 + CURVE() 243 + GEOMETRIC_REPRESENTATION_ITEM() 244 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 245 + REPRESENTATION_ITEM('') 246 + ); 247 + #163 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 10.0)); 248 + #164 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 10.0)); 249 + #165 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 10.0)); 250 + #166 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 10.0)); 251 + #167 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 10.0)); 252 + #168 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 10.0)); 253 + #169 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); 254 + #170 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); 255 + #171 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); 256 + #172 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 10.0)); 257 + #173 = CARTESIAN_POINT('', (5.0, 0.0, 10.0)); 258 + #174 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 10.0)); 259 + ENDSEC; 260 + END-ISO-10303-21;
+477
crates/bone-interop/tests/goldens/donut.step
··· 1 + ISO-10303-21; 2 + HEADER; 3 + FILE_DESCRIPTION(('Bone geometry'),'2;1'); 4 + FILE_NAME('donut','1970-01-01T00:00:00',(''),(''),'','Bone 0.0.0',''); 5 + FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 6 + ENDSEC; 7 + DATA; 8 + #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 'automotive_design', 2000, #2); 9 + #2 = APPLICATION_CONTEXT('core data for automotive mechanical design processes'); 10 + #3 = SHAPE_DEFINITION_REPRESENTATION(#4, #10); 11 + #4 = PRODUCT_DEFINITION_SHAPE('','', #5); 12 + #5 = PRODUCT_DEFINITION('design','', #6, #9); 13 + #6 = PRODUCT_DEFINITION_FORMATION('','', #7); 14 + #7 = PRODUCT('','','', (#8)); 15 + #8 = PRODUCT_CONTEXT('', #2, 'mechanical'); 16 + #9 = PRODUCT_DEFINITION_CONTEXT('part definition', #2, 'design'); 17 + #10 = ADVANCED_BREP_SHAPE_REPRESENTATION('', (#16), #11); 18 + #11 = ( 19 + GEOMETRIC_REPRESENTATION_CONTEXT(3) 20 + GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#15)) 21 + GLOBAL_UNIT_ASSIGNED_CONTEXT((#12, #13, #14)) 22 + REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') 23 + ); 24 + #12 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 25 + #13 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 26 + #14 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 27 + #15 = UNCERTAINTY_MEASURE_WITH_UNIT(1.0E-6, #12, 'distance_accuracy_value','confusion accuracy'); 28 + #16 = MANIFOLD_SOLID_BREP('', #17); 29 + #17 = CLOSED_SHELL('', (#18, #29, #36, #43, #50, #57, #64, #71)); 30 + #18 = FACE_SURFACE('', (#19, #24), #112, .F.); 31 + #19 = FACE_BOUND('', #20, .F.); 32 + #20 = EDGE_LOOP('', (#21, #22, #23)); 33 + #21 = ORIENTED_EDGE('', *, *, #82, .T.); 34 + #22 = ORIENTED_EDGE('', *, *, #83, .T.); 35 + #23 = ORIENTED_EDGE('', *, *, #84, .T.); 36 + #24 = FACE_BOUND('', #25, .F.); 37 + #25 = EDGE_LOOP('', (#26, #27, #28)); 38 + #26 = ORIENTED_EDGE('', *, *, #85, .T.); 39 + #27 = ORIENTED_EDGE('', *, *, #86, .T.); 40 + #28 = ORIENTED_EDGE('', *, *, #87, .T.); 41 + #29 = FACE_SURFACE('', (#30), #117, .T.); 42 + #30 = FACE_BOUND('', #31, .T.); 43 + #31 = EDGE_LOOP('', (#32, #33, #34, #35)); 44 + #32 = ORIENTED_EDGE('', *, *, #82, .T.); 45 + #33 = ORIENTED_EDGE('', *, *, #88, .T.); 46 + #34 = ORIENTED_EDGE('', *, *, #89, .F.); 47 + #35 = ORIENTED_EDGE('', *, *, #90, .F.); 48 + #36 = FACE_SURFACE('', (#37), #130, .T.); 49 + #37 = FACE_BOUND('', #38, .T.); 50 + #38 = EDGE_LOOP('', (#39, #40, #41, #42)); 51 + #39 = ORIENTED_EDGE('', *, *, #83, .T.); 52 + #40 = ORIENTED_EDGE('', *, *, #91, .T.); 53 + #41 = ORIENTED_EDGE('', *, *, #92, .F.); 54 + #42 = ORIENTED_EDGE('', *, *, #88, .F.); 55 + #43 = FACE_SURFACE('', (#44), #143, .T.); 56 + #44 = FACE_BOUND('', #45, .T.); 57 + #45 = EDGE_LOOP('', (#46, #47, #48, #49)); 58 + #46 = ORIENTED_EDGE('', *, *, #84, .T.); 59 + #47 = ORIENTED_EDGE('', *, *, #90, .T.); 60 + #48 = ORIENTED_EDGE('', *, *, #93, .F.); 61 + #49 = ORIENTED_EDGE('', *, *, #91, .F.); 62 + #50 = FACE_SURFACE('', (#51), #156, .T.); 63 + #51 = FACE_BOUND('', #52, .T.); 64 + #52 = EDGE_LOOP('', (#53, #54, #55, #56)); 65 + #53 = ORIENTED_EDGE('', *, *, #85, .T.); 66 + #54 = ORIENTED_EDGE('', *, *, #94, .T.); 67 + #55 = ORIENTED_EDGE('', *, *, #95, .F.); 68 + #56 = ORIENTED_EDGE('', *, *, #96, .F.); 69 + #57 = FACE_SURFACE('', (#58), #169, .T.); 70 + #58 = FACE_BOUND('', #59, .T.); 71 + #59 = EDGE_LOOP('', (#60, #61, #62, #63)); 72 + #60 = ORIENTED_EDGE('', *, *, #86, .T.); 73 + #61 = ORIENTED_EDGE('', *, *, #97, .T.); 74 + #62 = ORIENTED_EDGE('', *, *, #98, .F.); 75 + #63 = ORIENTED_EDGE('', *, *, #94, .F.); 76 + #64 = FACE_SURFACE('', (#65), #182, .T.); 77 + #65 = FACE_BOUND('', #66, .T.); 78 + #66 = EDGE_LOOP('', (#67, #68, #69, #70)); 79 + #67 = ORIENTED_EDGE('', *, *, #87, .T.); 80 + #68 = ORIENTED_EDGE('', *, *, #96, .T.); 81 + #69 = ORIENTED_EDGE('', *, *, #99, .F.); 82 + #70 = ORIENTED_EDGE('', *, *, #97, .F.); 83 + #71 = FACE_SURFACE('', (#72, #77), #195, .T.); 84 + #72 = FACE_BOUND('', #73, .T.); 85 + #73 = EDGE_LOOP('', (#74, #75, #76)); 86 + #74 = ORIENTED_EDGE('', *, *, #89, .T.); 87 + #75 = ORIENTED_EDGE('', *, *, #92, .T.); 88 + #76 = ORIENTED_EDGE('', *, *, #93, .T.); 89 + #77 = FACE_BOUND('', #78, .T.); 90 + #78 = EDGE_LOOP('', (#79, #80, #81)); 91 + #79 = ORIENTED_EDGE('', *, *, #95, .T.); 92 + #80 = ORIENTED_EDGE('', *, *, #98, .T.); 93 + #81 = ORIENTED_EDGE('', *, *, #99, .T.); 94 + #82 = EDGE_CURVE('', #100, #101, #200, .T.); 95 + #83 = EDGE_CURVE('', #101, #102, #207, .T.); 96 + #84 = EDGE_CURVE('', #102, #100, #214, .T.); 97 + #85 = EDGE_CURVE('', #103, #104, #221, .T.); 98 + #86 = EDGE_CURVE('', #104, #105, #228, .T.); 99 + #87 = EDGE_CURVE('', #105, #103, #235, .T.); 100 + #88 = EDGE_CURVE('', #101, #106, #242, .T.); 101 + #89 = EDGE_CURVE('', #107, #106, #246, .T.); 102 + #90 = EDGE_CURVE('', #100, #107, #253, .T.); 103 + #91 = EDGE_CURVE('', #102, #108, #257, .T.); 104 + #92 = EDGE_CURVE('', #106, #108, #261, .T.); 105 + #93 = EDGE_CURVE('', #108, #107, #268, .T.); 106 + #94 = EDGE_CURVE('', #104, #109, #275, .T.); 107 + #95 = EDGE_CURVE('', #110, #109, #279, .T.); 108 + #96 = EDGE_CURVE('', #103, #110, #286, .T.); 109 + #97 = EDGE_CURVE('', #105, #111, #290, .T.); 110 + #98 = EDGE_CURVE('', #109, #111, #294, .T.); 111 + #99 = EDGE_CURVE('', #111, #110, #301, .T.); 112 + #100 = VERTEX_POINT('', #308); 113 + #101 = VERTEX_POINT('', #309); 114 + #102 = VERTEX_POINT('', #310); 115 + #103 = VERTEX_POINT('', #311); 116 + #104 = VERTEX_POINT('', #312); 117 + #105 = VERTEX_POINT('', #313); 118 + #106 = VERTEX_POINT('', #314); 119 + #107 = VERTEX_POINT('', #315); 120 + #108 = VERTEX_POINT('', #316); 121 + #109 = VERTEX_POINT('', #317); 122 + #110 = VERTEX_POINT('', #318); 123 + #111 = VERTEX_POINT('', #319); 124 + #112 = PLANE('', #113); 125 + #113 = AXIS2_PLACEMENT_3D('', #114, #115, #116); 126 + #114 = CARTESIAN_POINT('', (10.0, 10.10362971081845, 0.0)); 127 + #115 = DIRECTION('', (0.0, 0.0, 1.0)); 128 + #116 = DIRECTION('', (-1.0, 0.0, 0.0)); 129 + #117 = ( 130 + BOUNDED_SURFACE() 131 + B_SPLINE_SURFACE(2, 1, ((#118, #119), (#120, #121), (#122, #123), (#124, #125), (#126, #127), (#128, #129)), .UNSPECIFIED., .U., .U., .U.) 132 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 133 + GEOMETRIC_REPRESENTATION_ITEM() 134 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) 135 + REPRESENTATION_ITEM('') 136 + SURFACE() 137 + ); 138 + #118 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); 139 + #119 = CARTESIAN_POINT('', (10.0, 0.0, 6.0)); 140 + #120 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 0.0)); 141 + #121 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 6.0)); 142 + #122 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 0.0)); 143 + #123 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 6.000000000000001)); 144 + #124 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 0.0)); 145 + #125 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 6.0)); 146 + #126 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 0.0)); 147 + #127 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 6.0)); 148 + #128 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 0.0)); 149 + #129 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 6.0)); 150 + #130 = ( 151 + BOUNDED_SURFACE() 152 + B_SPLINE_SURFACE(2, 1, ((#131, #132), (#133, #134), (#135, #136), (#137, #138), (#139, #140), (#141, #142)), .UNSPECIFIED., .U., .U., .U.) 153 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 154 + GEOMETRIC_REPRESENTATION_ITEM() 155 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) 156 + REPRESENTATION_ITEM('') 157 + SURFACE() 158 + ); 159 + #131 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); 160 + #132 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 6.0)); 161 + #133 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 0.0)); 162 + #134 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 6.0)); 163 + #135 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 0.0)); 164 + #136 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 6.000000000000001)); 165 + #137 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 0.0)); 166 + #138 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 6.0)); 167 + #139 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 0.0)); 168 + #140 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 6.0)); 169 + #141 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 0.0)); 170 + #142 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 6.0)); 171 + #143 = ( 172 + BOUNDED_SURFACE() 173 + B_SPLINE_SURFACE(2, 1, ((#144, #145), (#146, #147), (#148, #149), (#150, #151), (#152, #153), (#154, #155)), .UNSPECIFIED., .U., .U., .U.) 174 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 175 + GEOMETRIC_REPRESENTATION_ITEM() 176 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) 177 + REPRESENTATION_ITEM('') 178 + SURFACE() 179 + ); 180 + #144 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); 181 + #145 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 6.0)); 182 + #146 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 0.0)); 183 + #147 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 6.0)); 184 + #148 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 0.0)); 185 + #149 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 6.0)); 186 + #150 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 0.0)); 187 + #151 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 6.0)); 188 + #152 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 0.0)); 189 + #153 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 6.0)); 190 + #154 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 0.0)); 191 + #155 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 6.0)); 192 + #156 = ( 193 + BOUNDED_SURFACE() 194 + B_SPLINE_SURFACE(2, 1, ((#157, #158), (#159, #160), (#161, #162), (#163, #164), (#165, #166), (#167, #168)), .UNSPECIFIED., .U., .U., .U.) 195 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 196 + GEOMETRIC_REPRESENTATION_ITEM() 197 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) 198 + REPRESENTATION_ITEM('') 199 + SURFACE() 200 + ); 201 + #157 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); 202 + #158 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 6.0)); 203 + #159 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 0.0)); 204 + #160 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 6.0)); 205 + #161 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 0.0)); 206 + #162 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 6.000000000000001)); 207 + #163 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 0.0)); 208 + #164 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 6.0)); 209 + #165 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 0.0)); 210 + #166 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 6.0)); 211 + #167 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 0.0)); 212 + #168 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 6.0)); 213 + #169 = ( 214 + BOUNDED_SURFACE() 215 + B_SPLINE_SURFACE(2, 1, ((#170, #171), (#172, #173), (#174, #175), (#176, #177), (#178, #179), (#180, #181)), .UNSPECIFIED., .U., .U., .U.) 216 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 217 + GEOMETRIC_REPRESENTATION_ITEM() 218 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) 219 + REPRESENTATION_ITEM('') 220 + SURFACE() 221 + ); 222 + #170 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); 223 + #171 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 6.0)); 224 + #172 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 0.0)); 225 + #173 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 6.0)); 226 + #174 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 0.0)); 227 + #175 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 6.0)); 228 + #176 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 0.0)); 229 + #177 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 6.0)); 230 + #178 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 0.0)); 231 + #179 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 6.0)); 232 + #180 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 0.0)); 233 + #181 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 6.0)); 234 + #182 = ( 235 + BOUNDED_SURFACE() 236 + B_SPLINE_SURFACE(2, 1, ((#183, #184), (#185, #186), (#187, #188), (#189, #190), (#191, #192), (#193, #194)), .UNSPECIFIED., .U., .U., .U.) 237 + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) 238 + GEOMETRIC_REPRESENTATION_ITEM() 239 + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) 240 + REPRESENTATION_ITEM('') 241 + SURFACE() 242 + ); 243 + #183 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); 244 + #184 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 6.0)); 245 + #185 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 0.0)); 246 + #186 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 6.0)); 247 + #187 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 0.0)); 248 + #188 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 6.0)); 249 + #189 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 0.0)); 250 + #190 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 6.0)); 251 + #191 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 0.0)); 252 + #192 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 6.0)); 253 + #193 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 0.0)); 254 + #194 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 6.0)); 255 + #195 = PLANE('', #196); 256 + #196 = AXIS2_PLACEMENT_3D('', #197, #198, #199); 257 + #197 = CARTESIAN_POINT('', (10.0, 10.10362971081845, 6.0)); 258 + #198 = DIRECTION('', (0.0, 0.0, 1.0)); 259 + #199 = DIRECTION('', (-1.0, 0.0, 0.0)); 260 + #200 = ( 261 + BOUNDED_CURVE() 262 + B_SPLINE_CURVE(2, (#201, #202, #203, #204, #205, #206), .UNSPECIFIED., .U., .U.) 263 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 264 + CURVE() 265 + GEOMETRIC_REPRESENTATION_ITEM() 266 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 267 + REPRESENTATION_ITEM('') 268 + ); 269 + #201 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); 270 + #202 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 0.0)); 271 + #203 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 0.0)); 272 + #204 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 0.0)); 273 + #205 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 0.0)); 274 + #206 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 0.0)); 275 + #207 = ( 276 + BOUNDED_CURVE() 277 + B_SPLINE_CURVE(2, (#208, #209, #210, #211, #212, #213), .UNSPECIFIED., .U., .U.) 278 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 279 + CURVE() 280 + GEOMETRIC_REPRESENTATION_ITEM() 281 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 282 + REPRESENTATION_ITEM('') 283 + ); 284 + #208 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); 285 + #209 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 0.0)); 286 + #210 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 0.0)); 287 + #211 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 0.0)); 288 + #212 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 0.0)); 289 + #213 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 0.0)); 290 + #214 = ( 291 + BOUNDED_CURVE() 292 + B_SPLINE_CURVE(2, (#215, #216, #217, #218, #219, #220), .UNSPECIFIED., .U., .U.) 293 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 294 + CURVE() 295 + GEOMETRIC_REPRESENTATION_ITEM() 296 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 297 + REPRESENTATION_ITEM('') 298 + ); 299 + #215 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); 300 + #216 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 0.0)); 301 + #217 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 0.0)); 302 + #218 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 0.0)); 303 + #219 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 0.0)); 304 + #220 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 0.0)); 305 + #221 = ( 306 + BOUNDED_CURVE() 307 + B_SPLINE_CURVE(2, (#222, #223, #224, #225, #226, #227), .UNSPECIFIED., .U., .U.) 308 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 309 + CURVE() 310 + GEOMETRIC_REPRESENTATION_ITEM() 311 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 312 + REPRESENTATION_ITEM('') 313 + ); 314 + #222 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); 315 + #223 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 0.0)); 316 + #224 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 0.0)); 317 + #225 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 0.0)); 318 + #226 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 0.0)); 319 + #227 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 0.0)); 320 + #228 = ( 321 + BOUNDED_CURVE() 322 + B_SPLINE_CURVE(2, (#229, #230, #231, #232, #233, #234), .UNSPECIFIED., .U., .U.) 323 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 324 + CURVE() 325 + GEOMETRIC_REPRESENTATION_ITEM() 326 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 327 + REPRESENTATION_ITEM('') 328 + ); 329 + #229 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); 330 + #230 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 0.0)); 331 + #231 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 0.0)); 332 + #232 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 0.0)); 333 + #233 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 0.0)); 334 + #234 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 0.0)); 335 + #235 = ( 336 + BOUNDED_CURVE() 337 + B_SPLINE_CURVE(2, (#236, #237, #238, #239, #240, #241), .UNSPECIFIED., .U., .U.) 338 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 339 + CURVE() 340 + GEOMETRIC_REPRESENTATION_ITEM() 341 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 342 + REPRESENTATION_ITEM('') 343 + ); 344 + #236 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); 345 + #237 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 0.0)); 346 + #238 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 0.0)); 347 + #239 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 0.0)); 348 + #240 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 0.0)); 349 + #241 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 0.0)); 350 + #242 = LINE('', #243, #244); 351 + #243 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); 352 + #244 = VECTOR('', #245, 6.0); 353 + #245 = DIRECTION('', (0.0, 0.0, 1.0)); 354 + #246 = ( 355 + BOUNDED_CURVE() 356 + B_SPLINE_CURVE(2, (#247, #248, #249, #250, #251, #252), .UNSPECIFIED., .U., .U.) 357 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 358 + CURVE() 359 + GEOMETRIC_REPRESENTATION_ITEM() 360 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 361 + REPRESENTATION_ITEM('') 362 + ); 363 + #247 = CARTESIAN_POINT('', (10.0, 0.0, 6.0)); 364 + #248 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 6.0)); 365 + #249 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 6.000000000000001)); 366 + #250 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 6.0)); 367 + #251 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 6.0)); 368 + #252 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 6.0)); 369 + #253 = LINE('', #254, #255); 370 + #254 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); 371 + #255 = VECTOR('', #256, 6.0); 372 + #256 = DIRECTION('', (0.0, 0.0, 1.0)); 373 + #257 = LINE('', #258, #259); 374 + #258 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); 375 + #259 = VECTOR('', #260, 6.0); 376 + #260 = DIRECTION('', (0.0, 0.0, 1.0)); 377 + #261 = ( 378 + BOUNDED_CURVE() 379 + B_SPLINE_CURVE(2, (#262, #263, #264, #265, #266, #267), .UNSPECIFIED., .U., .U.) 380 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 381 + CURVE() 382 + GEOMETRIC_REPRESENTATION_ITEM() 383 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 384 + REPRESENTATION_ITEM('') 385 + ); 386 + #262 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 6.0)); 387 + #263 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 6.0)); 388 + #264 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 6.000000000000001)); 389 + #265 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 6.0)); 390 + #266 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 6.0)); 391 + #267 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 6.0)); 392 + #268 = ( 393 + BOUNDED_CURVE() 394 + B_SPLINE_CURVE(2, (#269, #270, #271, #272, #273, #274), .UNSPECIFIED., .U., .U.) 395 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 396 + CURVE() 397 + GEOMETRIC_REPRESENTATION_ITEM() 398 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 399 + REPRESENTATION_ITEM('') 400 + ); 401 + #269 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 6.0)); 402 + #270 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 6.0)); 403 + #271 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 6.0)); 404 + #272 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 6.0)); 405 + #273 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 6.0)); 406 + #274 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 6.0)); 407 + #275 = LINE('', #276, #277); 408 + #276 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); 409 + #277 = VECTOR('', #278, 6.0); 410 + #278 = DIRECTION('', (0.0, 0.0, 1.0)); 411 + #279 = ( 412 + BOUNDED_CURVE() 413 + B_SPLINE_CURVE(2, (#280, #281, #282, #283, #284, #285), .UNSPECIFIED., .U., .U.) 414 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 415 + CURVE() 416 + GEOMETRIC_REPRESENTATION_ITEM() 417 + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) 418 + REPRESENTATION_ITEM('') 419 + ); 420 + #280 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 6.0)); 421 + #281 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 6.0)); 422 + #282 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 6.000000000000001)); 423 + #283 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 6.0)); 424 + #284 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 6.0)); 425 + #285 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 6.0)); 426 + #286 = LINE('', #287, #288); 427 + #287 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); 428 + #288 = VECTOR('', #289, 6.0); 429 + #289 = DIRECTION('', (0.0, 0.0, 1.0)); 430 + #290 = LINE('', #291, #292); 431 + #291 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); 432 + #292 = VECTOR('', #293, 6.0); 433 + #293 = DIRECTION('', (0.0, 0.0, 1.0)); 434 + #294 = ( 435 + BOUNDED_CURVE() 436 + B_SPLINE_CURVE(2, (#295, #296, #297, #298, #299, #300), .UNSPECIFIED., .U., .U.) 437 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 438 + CURVE() 439 + GEOMETRIC_REPRESENTATION_ITEM() 440 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 441 + REPRESENTATION_ITEM('') 442 + ); 443 + #295 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 6.0)); 444 + #296 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 6.0)); 445 + #297 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 6.0)); 446 + #298 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 6.0)); 447 + #299 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 6.0)); 448 + #300 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 6.0)); 449 + #301 = ( 450 + BOUNDED_CURVE() 451 + B_SPLINE_CURVE(2, (#302, #303, #304, #305, #306, #307), .UNSPECIFIED., .U., .U.) 452 + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) 453 + CURVE() 454 + GEOMETRIC_REPRESENTATION_ITEM() 455 + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) 456 + REPRESENTATION_ITEM('') 457 + ); 458 + #302 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 6.0)); 459 + #303 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 6.0)); 460 + #304 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 6.0)); 461 + #305 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 6.0)); 462 + #306 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 6.0)); 463 + #307 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 6.0)); 464 + #308 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); 465 + #309 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); 466 + #310 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); 467 + #311 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); 468 + #312 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); 469 + #313 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); 470 + #314 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 6.0)); 471 + #315 = CARTESIAN_POINT('', (10.0, 0.0, 6.0)); 472 + #316 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 6.0)); 473 + #317 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 6.0)); 474 + #318 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 6.0)); 475 + #319 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 6.0)); 476 + ENDSEC; 477 + END-ISO-10303-21;
+50
crates/bone-interop/tests/step.rs
··· 172 172 matches_golden("cube", rectangle_sketch(), 4.0); 173 173 } 174 174 175 + #[test] 176 + fn cylinder_step_matches_golden() { 177 + matches_golden("cylinder", circle_sketch(5.0), 10.0); 178 + } 179 + 180 + #[test] 181 + fn donut_step_matches_golden() { 182 + matches_golden("donut", donut_sketch(), 6.0); 183 + } 184 + 175 185 fn evaluates_within_bounds(seed: &Document, min_mm: [f64; 3], max_mm: [f64; 3], label: &str) { 176 186 let Ok(solid) = body_of(seed) else { 177 187 panic!("{label} evaluates to one body"); ··· 276 286 #[test] 277 287 fn donut_document_round_trips() { 278 288 document_round_trips(&document("donut", donut_sketch(), 6.0)); 289 + } 290 + 291 + fn corners_mm(bbox: &Aabb3) -> [[f64; 3]; 2] { 292 + let (lo_x, lo_y, lo_z) = bbox.min().coords_mm(); 293 + let (hi_x, hi_y, hi_z) = bbox.max().coords_mm(); 294 + [[lo_x, lo_y, lo_z], [hi_x, hi_y, hi_z]] 295 + } 296 + 297 + #[test] 298 + fn step_export_then_import_preserves_solid_under_tolerance() { 299 + const MATCH_TOL_MM: f64 = 1.0e-6; 300 + let seed = document("cube", rectangle_sketch(), 4.0); 301 + let Ok(original) = body_of(&seed) else { 302 + panic!("the seed evaluates to one body"); 303 + }; 304 + let imported = imported_document(&seed); 305 + let Ok(reimported) = body_of(&imported) else { 306 + panic!("export then import yields one body"); 307 + }; 308 + let before = corners_mm(&solid_bounds(&original)); 309 + let after = corners_mm(&solid_bounds(&reimported)); 310 + before 311 + .iter() 312 + .flatten() 313 + .zip(after.iter().flatten()) 314 + .enumerate() 315 + .for_each(|(slot, (b, a))| { 316 + assert!( 317 + (b - a).abs() <= MATCH_TOL_MM, 318 + "re-imported corner slot {slot} drifts past {MATCH_TOL_MM} mm: {b} -> {a}" 319 + ); 320 + }); 321 + assert!( 322 + !is_dumb(&reimported), 323 + "the matched sidecar restores a labeled solid" 324 + ); 325 + assert!( 326 + reimported.validate(TOL).is_ok(), 327 + "the re-imported solid stays valid" 328 + ); 279 329 } 280 330 281 331 #[test]
crates/bone-ui/tests/snapshots/gallery_dark.png

This is a binary file and will not be displayed.

crates/bone-ui/tests/snapshots/gallery_light.png

This is a binary file and will not be displayed.