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; }; }
/// <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()); }