示例#1
0
        public void SetActiveItem(IObject3D selectedItem)
        {
            this.item = selectedItem;
            editorPanel.CloseAllChildren();

            // Allow caller to clean up with passing null for selectedItem
            if (item == null)
            {
                return;
            }

            var selectedItemType = selectedItem.GetType();

            editorSectionWidget.Text = selectedItem.Name ?? selectedItemType.Name;

            HashSet <IObject3DEditor> mappedEditors = ApplicationController.Instance.GetEditorsForType(selectedItemType);

            var undoBuffer = sceneContext.Scene.UndoBuffer;

            bool allowOperations = true;

            // put in a color edit field
            var colorField = new ColorField(theme, selectedItem.Color);

            colorField.Initialize(0);
            colorField.ValueChanged += (s, e) =>
            {
                if (selectedItem.Color != colorField.Color)
                {
                    undoBuffer.AddAndDo(new ChangeColor(selectedItem, colorField.Color));
                }
            };

            var colorRow = PublicPropertyEditor.CreateSettingsRow("Color".Localize());

            colorRow.AddChild(colorField.Content);
            colorField.Content.MouseDown += (s, e) =>
            {
                // make sure the render mode is set to shaded or outline
                if (sceneContext.ViewState.RenderType != RenderOpenGl.RenderTypes.Shaded &&
                    sceneContext.ViewState.RenderType != RenderOpenGl.RenderTypes.Outlines)
                {
                    // make sure the render mode is set to material
                    sceneContext.ViewState.RenderType = RenderOpenGl.RenderTypes.Outlines;
                }
            };
            editorPanel.AddChild(colorRow);

            // put in a material edit field
            var materialField = new MaterialIndexField(theme, selectedItem.MaterialIndex);

            materialField.Initialize(0);
            materialField.ValueChanged += (s, e) =>
            {
                if (selectedItem.MaterialIndex != materialField.MaterialIndex)
                {
                    undoBuffer.AddAndDo(new ChangeMaterial(selectedItem, materialField.MaterialIndex));
                }
            };

            var materialRow = PublicPropertyEditor.CreateSettingsRow("Material".Localize());

            materialRow.AddChild(materialField.Content);
            materialField.Content.MouseDown += (s, e) =>
            {
                if (sceneContext.ViewState.RenderType != RenderOpenGl.RenderTypes.Materials)
                {
                    // make sure the render mode is set to material
                    sceneContext.ViewState.RenderType = RenderOpenGl.RenderTypes.Materials;
                }
            };
            editorPanel.AddChild(materialRow);

            // put in the normal editor
            if (selectedItem is ComponentObject3D componentObject &&
                componentObject.Finalized)
            {
                allowOperations = false;

                foreach (var selector in componentObject.SurfacedEditors)
                {
                    // Get the named property via reflection
                    // Selector example:            '$.Children<CylinderObject3D>'
                    var match = pathResolver.Select(componentObject, selector).ToList();

                    //// TODO: Create editor row for each property
                    //// - Use the type of the property to find a matching editor (ideally all datatype -> editor functionality would resolve consistently)
                    //// - Add editor row for each

                    foreach (var instance in match)
                    {
                        if (instance is IObject3D object3D)
                        {
                            if (ApplicationController.Instance.GetEditorsForType(object3D.GetType())?.FirstOrDefault() is IObject3DEditor editor)
                            {
                                ShowObjectEditor((editor, object3D, object3D.Name), selectedItem, allowOperations: allowOperations);
                            }
                        }
                        else if (JsonPath.JsonPathContext.ReflectionValueSystem.LastMemberValue is ReflectionTarget reflectionTarget)
                        {
                            var context = new PPEContext();

                            if (reflectionTarget.Source is IObject3D editedChild)
                            {
                                context.item = editedChild;
                            }
                            else
                            {
                                context.item = item;
                            }

                            var editableProperty = new EditableProperty(reflectionTarget.PropertyInfo, reflectionTarget.Source);

                            var editor = PublicPropertyEditor.CreatePropertyEditor(editableProperty, undoBuffer, context, theme);
                            if (editor != null)
                            {
                                editorPanel.AddChild(editor);
                            }
                        }
                    }
                }

                // Enforce panel padding
                foreach (var sectionWidget in editorPanel.Descendants <SectionWidget>())
                {
                    sectionWidget.Margin = new BorderDouble(0, theme.DefaultContainerPadding / 2);
                }
            }
        public GenerateSupportPanel(ThemeConfig theme, InteractiveScene scene, double minimumSupportHeight)
            : base(FlowDirection.TopToBottom)
        {
            supportGenerator = new SupportGenerator(scene, minimumSupportHeight);

            this.scene = scene;
            this.theme = theme;

            this.VAnchor         = VAnchor.Fit;
            this.HAnchor         = HAnchor.Absolute;
            this.Width           = 300;
            this.BackgroundColor = theme.BackgroundColor;
            this.Padding         = theme.DefaultContainerPadding;

            // Add an editor field for the SupportGenerator.SupportType
            PropertyInfo propertyInfo = typeof(SupportGenerator).GetProperty(nameof(SupportGenerator.SupportType));

            var editor = PublicPropertyEditor.CreatePropertyEditor(
                new EditableProperty(propertyInfo, supportGenerator),
                null,
                new PPEContext(),
                theme);

            if (editor != null)
            {
                this.AddChild(editor);
            }

            // put in support pillar size
            var pillarSizeField = new DoubleField(theme);

            pillarSizeField.Initialize(0);
            pillarSizeField.DoubleValue   = supportGenerator.PillarSize;
            pillarSizeField.ValueChanged += (s, e) =>
            {
                supportGenerator.PillarSize = pillarSizeField.DoubleValue;
                // in case it was corrected set it back again
                if (pillarSizeField.DoubleValue != supportGenerator.PillarSize)
                {
                    pillarSizeField.DoubleValue = supportGenerator.PillarSize;
                }
            };

            var pillarRow = PublicPropertyEditor.CreateSettingsRow("Pillar Size".Localize(), "The width and depth of the support pillars".Localize(), theme);

            pillarRow.AddChild(pillarSizeField.Content);
            this.AddChild(pillarRow);

            // put in the angle setting
            var overHangField = new DoubleField(theme);

            overHangField.Initialize(0);
            overHangField.DoubleValue   = supportGenerator.MaxOverHangAngle;
            overHangField.ValueChanged += (s, e) =>
            {
                supportGenerator.MaxOverHangAngle = overHangField.DoubleValue;
                // in case it was corrected set it back again
                if (overHangField.DoubleValue != supportGenerator.MaxOverHangAngle)
                {
                    overHangField.DoubleValue = supportGenerator.MaxOverHangAngle;
                }
            };

            var overHangRow = PublicPropertyEditor.CreateSettingsRow("Overhang Angle".Localize(), "The angle to generate support for".Localize(), theme);

            overHangRow.AddChild(overHangField.Content);
            this.AddChild(overHangRow);

            // Button Row
            var buttonRow = new FlowLayoutWidget()
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Margin  = new BorderDouble(top: 5)
            };

            this.AddChild(buttonRow);

            buttonRow.AddChild(new HorizontalSpacer());

            // add 'Remove Auto Supports' button
            var removeButton = theme.CreateDialogButton("Remove".Localize());

            removeButton.ToolTipText = "Remove all auto generated supports".Localize();
            removeButton.Click      += (s, e) => supportGenerator.RemoveExisting();
            buttonRow.AddChild(removeButton);

            // add 'Generate Supports' button
            var generateButton = theme.CreateDialogButton("Generate".Localize());

            generateButton.ToolTipText = "Find and create supports where needed".Localize();
            generateButton.Click      += (s, e) => Rebuild();
            buttonRow.AddChild(generateButton);
            theme.ApplyPrimaryActionStyle(generateButton);
        }