コード例 #1
0
        private void BindMouseEvents(ModelUIElement3D model, Node elm)
        {
            var tagGuid = @"35DA1A20-AA6D-4436-890E-CBFA341F9E51";

            Material oldfrontm = null;
            Material oldbackm  = null;

            #region MouseEnter

            model.MouseEnter += (sender, e) =>
            {
                var tb = MainCanvas.Children
                         .Cast <UIElement>()
                         .Where(i => i is Border)
                         .Cast <Border>()
                         .FirstOrDefault(i => tagGuid.Equals(i.Tag));

                if (tb == null)
                {
                    MainCanvas.Children.Add(tb = new Border()
                    {
                        Tag = tagGuid
                    });
                    tb.Child             = new TextBlock();
                    tb.MouseMove        += (o, args) => { args.Handled = false; };
                    tb.PreviewMouseMove += (o, args) => { args.Handled = false; };
                    StyleTexblock(tb);
                }

                var tx = tb.Child as TextBlock;

                if (tx != null)
                {
                    tx.Text = "NODE: " + elm.Label;
                }


                var geo = model.Model as GeometryModel3D;

                if (geo != null)
                {
                    oldfrontm = geo.Material;
                    oldbackm  = geo.BackMaterial;

                    geo.Material = geo.BackMaterial = MaterialHelper.CreateMaterial(Brushes.Aqua);
                }
            };

            #endregion

            #region MouseMove

            model.MouseMove += (sender, e) =>
            {
                Border tb = null;

                foreach (var child in MainCanvas.Children)
                {
                    if (child is Border)
                    {
                        if (tagGuid.Equals((child as Border).Tag))
                        {
                            tb = child as Border;
                            break;
                        }
                    }
                }

                if (tb == null)
                {
                    return;
                }

                tb.Visibility = Visibility.Visible;

                var mousePos = e.GetPosition(MainCanvas);

                Canvas.SetLeft(tb, mousePos.X - tb.ActualWidth - 10);
                Canvas.SetTop(tb, mousePos.Y - tb.ActualHeight - 10);
            };

            #endregion

            #region MouseLeave

            model.MouseLeave += (sender, args) =>
            {
                Border tb = null;

                foreach (var child in MainCanvas.Children)
                {
                    if (child is Border)
                    {
                        if (tagGuid.Equals((child as Border).Tag))
                        {
                            tb = child as Border;
                            break;
                        }
                    }
                }

                if (tb == null)
                {
                    return;
                }

                tb.Visibility = Visibility.Collapsed;

                var geo = model.Model as GeometryModel3D;

                if (geo != null)
                {
                    geo.Material     = oldfrontm;
                    geo.BackMaterial = oldbackm;
                }
            };

            #endregion

            model.MouseDown += (sender, args) =>
            {
                var grd = new DataGrid();

                PropertyHelper.Populate(grd, elm);

                grd.ItemsSource = new[] { elm };

                if (DisableEditingProperties)
                {
                    grd.IsReadOnly = true;
                }

                var wnd = new Window();
                wnd.Content = grd;
                wnd.ShowDialog();
                args.Handled = true;
            };
        }
コード例 #2
0
        /// <summary>
        /// Updates the UI.
        /// </summary>
        public void UpdateUi()
        {
            MainViewport.Children.Clear();

            if (!this.IsLoaded)
            {
                return;
            }

            if (ModelToVisualize == null)
            {
                return;
            }

            if (!ModelToVisualize.Nodes.Any())
            {
                return;
            }


            if (ElementVisualThickness == 0)
            {
                ElementVisualThickness = GetSmartElementThichness();
            }

            #region Adding elements

            var sb = new StringBuilder();


            if (ShowElements)
            {
                foreach (var elm in ModelToVisualize.Elements)
                {
                    var builder = new MeshBuilder(false, false);

                    if (elm is FrameElement2Node)
                    {
                        AddFrameElement(builder, elm as FrameElement2Node);
                    }
                    else if (elm is ConcentratedMass)
                    {
                        AddMassElement(builder, elm as ConcentratedMass);
                    }
                    else if (elm is TrussElement2Node)
                    {
                        AddTrussElement(builder, elm as TrussElement2Node);
                    }
                    else if (elm is DktElement)
                    {
                        AddDktElement(builder, elm as DktElement);
                    }
                    else if (elm is Tetrahedral)
                    {
                        AddTetrahedronElement(builder, elm as Tetrahedral);
                    }
                    else if (elm is TriangleFlatShell)
                    {
                        AddFlatshellElement(builder, elm as TriangleFlatShell);
                    }
                    else if (elm is CstElement)
                    {
                        AddCstElement(builder, elm as CstElement);
                    }
                    else if (elm is Element2D)
                    {
                        AddElement2d(builder, elm as Element2D);
                    }
                    else if (elm is Element3D)
                    {
                        AddElement3D(builder, elm as Element3D);
                    }
                    else if (elm is Spring1D)
                    {
                        AddSpringElement(builder, elm as Spring1D);
                    }

                    var gradient = new LinearGradientBrush();
                    //TODO: to be done like this: http://waldoscode.blogspot.de/2014/11/helix-3d-toolkit-well-viewer-part-2.html


                    gradient.GradientStops.Add(new GradientStop(Colors.Blue, 0));
                    gradient.GradientStops.Add(new GradientStop(Colors.Cyan, 0.2));
                    gradient.GradientStops.Add(new GradientStop(Colors.Green, 0.4));
                    gradient.GradientStops.Add(new GradientStop(Colors.Yellow, 0.6));
                    gradient.GradientStops.Add(new GradientStop(Colors.Red, 0.8));
                    gradient.GradientStops.Add(new GradientStop(Colors.White, 1));


                    var mesh = builder.ToMesh(true);

                    var material = MaterialHelper.CreateMaterial(gradient, null, null, 1, 0);

                    var mygeometry = new GeometryModel3D(mesh, material)
                    {
                        BackMaterial = material
                    };

                    var modelElement = new ModelUIElement3D();
                    modelElement.Model = mygeometry;


                    BindMouseEvents(modelElement, elm);
                    // var myModelVisual3D = new ModelVisual3D();
                    //myModelVisual3D.Content = modelGroup;


                    MainViewport.Children.Add(modelElement);
                }
            }

            #endregion

            #region Adding nodes

            if (ShowNodes)
            {
                foreach (var nde in ModelToVisualize.Nodes)
                {
                    var builder = new MeshBuilder(false, false);

                    AddNode(builder, nde);

                    var gradient = new LinearGradientBrush();
                    //to be done like this: http://waldoscode.blogspot.de/2014/11/helix-3d-toolkit-well-viewer-part-2.html

                    gradient.GradientStops.Add(new GradientStop(Colors.Blue, 0));
                    gradient.GradientStops.Add(new GradientStop(Colors.Cyan, 0.2));
                    gradient.GradientStops.Add(new GradientStop(Colors.Green, 0.4));
                    gradient.GradientStops.Add(new GradientStop(Colors.Yellow, 0.6));
                    gradient.GradientStops.Add(new GradientStop(Colors.Red, 0.8));
                    gradient.GradientStops.Add(new GradientStop(Colors.White, 1));


                    var mesh = builder.ToMesh(true);

                    var material = MaterialHelper.CreateMaterial(Brushes.Crimson);

                    var mygeometry = new GeometryModel3D(mesh, material)
                    {
                        BackMaterial = material
                    };

                    var modelElement = new ModelUIElement3D();
                    modelElement.Model = mygeometry;

                    BindMouseEvents(modelElement, nde);
                    // var myModelVisual3D = new ModelVisual3D();
                    //myModelVisual3D.Content = modelGroup;


                    MainViewport.Children.Add(modelElement);
                }
            }

            #endregion

            #region Adding rigid elements

            if (ShowRigidElements)
            {
                foreach (var elm in ModelToVisualize.RigidElements)
                {
                    var builder = new MeshBuilder(false, false);

                    AddRigidElement(builder, elm);

                    var gradient = new LinearGradientBrush();
                    //to be done like this: http://waldoscode.blogspot.de/2014/11/helix-3d-toolkit-well-viewer-part-2.html

                    gradient.GradientStops.Add(new GradientStop(Colors.Blue, 0));
                    gradient.GradientStops.Add(new GradientStop(Colors.Cyan, 0.2));
                    gradient.GradientStops.Add(new GradientStop(Colors.Green, 0.4));
                    gradient.GradientStops.Add(new GradientStop(Colors.Yellow, 0.6));
                    gradient.GradientStops.Add(new GradientStop(Colors.Red, 0.8));
                    gradient.GradientStops.Add(new GradientStop(Colors.White, 1));


                    var mesh = builder.ToMesh(true);

                    var material = MaterialHelper.CreateMaterial(Brushes.GreenYellow, Brushes.Green, Brushes.Green, 1,
                                                                 100);


                    var mygeometry = new GeometryModel3D(mesh, material)
                    {
                        BackMaterial = material
                    };

                    var modelElement = new ModelUIElement3D();
                    modelElement.Model = mygeometry;

                    BindMouseEvents(modelElement, elm);
                    // var myModelVisual3D = new ModelVisual3D();
                    //myModelVisual3D.Content = modelGroup;


                    MainViewport.Children.Add(modelElement);
                }
            }

            #endregion

            if (sb.Length != 0)
            {
                MessageBox.Show(sb.ToString());
            }


            MainViewport.Children.Add(new DefaultLights());
        }