public override Task Rebuild() { this.DebugDepth("Rebuild"); bool valuesChanged = false; using (RebuildLock()) { if (Mesh == null) { using (var meshStream = StaticData.Instance.OpenStream(Path.Combine("Stls", "openscad_logo.stl"))) { using (new CenterAndHeightMaintainer(this)) { this.Mesh = Object3D.Load(meshStream, ".stl", CancellationToken.None).Mesh; } } } } if (valuesChanged) { Invalidate(InvalidateType.DisplayValues); } Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Mesh)); return(Task.CompletedTask); }
public void AmfFilesSaveObjectProperties() { AssetObject3D.AssetManager = new AssetManager(); var scene = new InteractiveScene(); scene.Children.Add(new Object3D { Mesh = PlatonicSolids.CreateCube(20, 20, 20), Name = "test1", OutputType = PrintOutputTypes.Support, Color = Color.Red, MaterialIndex = 2, }); scene.Children.Add(new Object3D { Mesh = PlatonicSolids.CreateCube(20, 20, 20), Name = "test2", Matrix = Matrix4X4.CreateTranslation(30, 0, 0) }); string tempPath = GetSceneTempPath(); Object3D.AssetsPath = Path.Combine(tempPath, "Assets"); string filePath = Path.Combine(tempPath, "exportTest.amf"); scene.SetSelection(scene.Children.ToList()); AmfDocument.Save(scene.SelectedItem, filePath); Assert.IsTrue(File.Exists(filePath)); IObject3D loadedItem = Object3D.Load(filePath, CancellationToken.None); Assert.IsTrue(loadedItem.Children.Count == 2); IObject3D item1 = loadedItem.Children.Last(); Assert.AreEqual("test1", item1.Name); Assert.AreEqual(PrintOutputTypes.Support, item1.OutputType); Assert.AreEqual(2, item1.MaterialIndex); Assert.AreEqual(Color.Red, item1.Color); Assert.AreEqual(12, item1.Mesh.Faces.Count); var aabb1 = item1.GetAxisAlignedBoundingBox(); Assert.True(new AxisAlignedBoundingBox(-10, -10, -10, 10, 10, 10).Equals(aabb1, .001)); IObject3D item2 = loadedItem.Children.First(); Assert.AreEqual("test2", item2.Name); Assert.AreEqual(Color.White, item2.Color); Assert.AreEqual(12, item2.Mesh.Faces.Count); var aabb2 = item2.GetAxisAlignedBoundingBox(); Assert.True(new AxisAlignedBoundingBox(20, -10, -10, 40, 10, 10).Equals(aabb2, .001)); }
public async Task LoadItemIntoScene(string itemPath, Vector2 bedCenter = new Vector2(), string itemName = null) { if (File.Exists(itemPath)) { BeginProgressReporting("Loading Mesh"); // TODO: How to we handle mesh load errors? How do we report success? IObject3D loadedItem = await Task.Run(() => Object3D.Load(itemPath, CancellationToken.None, progress: ReportProgress0to100)); if (loadedItem != null) { if (itemName != null) { loadedItem.Name = itemName; } // SetMeshAfterLoad Scene.Children.Modify(children => { if (loadedItem.Mesh != null) { // STLs currently load directly into the mesh rather than as a group like AMF children.Add(loadedItem); } else { children.AddRange(loadedItem.Children); } }); CreateGlDataObject(loadedItem); } else { partProcessingInfo.centeredInfoText.Text = string.Format("Sorry! No 3D view available\nfor this file."); } EndProgressReporting(); // Invoke LoadDone event LoadDone?.Invoke(this, null); Invalidate(); } else { partProcessingInfo.centeredInfoText.Text = string.Format("{0}\n'{1}'", "File not found on disk.", Path.GetFileName(itemPath)); } }
public void SaveSimpleScene() { var scene = new InteractiveScene(); scene.Children.Add(new Object3D()); string tempPath = GetSceneTempPath(); Object3D.AssetsPath = Path.Combine(tempPath, "Assets"); string filePath = Path.Combine(tempPath, "some.mcx"); scene.Save(filePath); Assert.IsTrue(File.Exists(filePath)); IObject3D loadedItem = Object3D.Load(filePath, CancellationToken.None); Assert.IsTrue(loadedItem.Children.Count == 1); }