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);
        }
示例#2
0
        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));
        }
示例#3
0
        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));
            }
        }
示例#4
0
		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);
		}