private void AddElement3D(MeshBuilder bldr, Element3D elm)
        {
            if (elm.Nodes.Length == 8)
            {
                //brick

                var p = new Func <Node, Point>(i => i.Location);

                var sides = new int[][]
                {
                    new int[] { 1, 2, 6 }, new int[] { 1, 5, 6 },
                    new int[] { 2, 6, 3 }, new int[] { 7, 6, 3 },
                    new int[] { 4, 3, 7 }, new int[] { 4, 8, 7 },

                    new int[] { 1, 4, 8 }, new int[] { 1, 5, 8 },
                    new int[] { 5, 6, 7 }, new int[] { 5, 8, 7 },
                    new int[] { 1, 2, 3 }, new int[] { 1, 4, 3 },
                };



                foreach (var side in sides)
                {
                    bldr.AddTriangle(p(elm.Nodes[side[0] - 1]), p(elm.Nodes[side[1] - 1]), p(elm.Nodes[side[2] - 1]));
                }
            }
        }
        private void AddElement2d(MeshBuilder bldr, Element2D elm)
        {
            if (elm.Nodes.Length == 4)
            {
                var p1 = elm.Nodes[0].Location;
                var p2 = elm.Nodes[1].Location;
                var p3 = elm.Nodes[2].Location;
                var p4 = elm.Nodes[3].Location;


                bldr.AddTriangle(p1, p2, p3);

                bldr.AddTriangle(p1, p3, p4);
            }


            if (elm.Nodes.Length == 3)
            {
                var p1 = elm.Nodes[0].Location;
                var p2 = elm.Nodes[1].Location;
                var p3 = elm.Nodes[2].Location;


                bldr.AddTriangle(p1, p2, p3);
            }
        }
        private void AddRigidElement(MeshBuilder bldr, RigidElement elm)
        {
            PolygonYz section = null;

            if (elm.Nodes.Count(i => !ReferenceEquals(i, null)) < 2)
            {
                return;
            }

            var r = ElementVisualThickness / 2;

            var cnt = elm.CentralNode;

            if (cnt == null)
            {
                cnt = elm.Nodes.First(i => !ReferenceEquals(i, null));

                /*
                 * for (int i = 0; i < elm.Nodes.Count; i++)
                 * {
                 *  for (int j = 0; j < elm.Nodes.Count; j++)
                 *  {
                 *      if(i==j)
                 *          continue;
                 *
                 *      var st = elm.Nodes[i].Location.ToPoint3D();
                 *      var en = elm.Nodes[j].Location.ToPoint3D();
                 *
                 *      bldr.AddPipe(st, en, ElementVisualThickness / 2, ElementVisualThickness / 1.9, 4);
                 *  }
                 * }
                 */
            }
            //else
            {
                for (var i = 0; i < elm.Nodes.Count; i++)
                {
                    if (ReferenceEquals(elm.Nodes[i], null))
                    {
                        continue;
                    }

                    if (ReferenceEquals(elm.Nodes[i], cnt))
                    {
                        continue;
                    }

                    var st = elm.Nodes[i].Location.ToPoint3D();
                    var en = cnt.Location.ToPoint3D();

                    bldr.AddPipe(st, en, ElementVisualThickness / 2, ElementVisualThickness / 1.9, 4);
                }
            }
        }
        private void AddSpringElement(MeshBuilder bldr, Spring1D elm)
        {
            PolygonYz section = null;

            var r = ElementVisualThickness / 2;

            if (elm.StartNode.Location.Equals(elm.EndNode.Location))
            {
                bldr.AddSphere(new Point3D(elm.StartNode.Location.X,
                                           elm.StartNode.Location.Y,
                                           elm.StartNode.Location.Z), ElementVisualThickness * 3);
            }
        }
        private void AddCstElement(MeshBuilder bldr, CstElement elm)
        {
            PolygonYz section = null;

            var r = ElementVisualThickness / 2;


            var p1 = elm.Nodes[0].Location;
            var p2 = elm.Nodes[1].Location;
            var p3 = elm.Nodes[2].Location;


            bldr.AddTriangle(p1, p3, p2);
        }
        private void AddTetrahedronElement(MeshBuilder bldr, Tetrahedral elm)
        {
            PolygonYz section = null;

            var r = ElementVisualThickness / 2;


            var p1 = elm.Nodes[0].Location;
            var p2 = elm.Nodes[1].Location;
            var p3 = elm.Nodes[2].Location;
            var p4 = elm.Nodes[3].Location;


            bldr.AddTriangle(p1, p3, p4);
            bldr.AddTriangle(p3, p2, p4);
            bldr.AddTriangle(p1, p2, p4);
            bldr.AddTriangle(p1, p2, p3);
        }
        private void AddTrussElement(MeshBuilder bldr, TrussElement2Node elm)
        {
            PolygonYz section = null;

            var r = ElementVisualThickness / 2;


            if (elm.UseOverridedProperties)
            {
                section = new PolygonYz(
                    new PointYZ(-r, -r),
                    new PointYZ(-r, r),
                    new PointYZ(r, r),
                    new PointYZ(r, -r),
                    new PointYZ(-r, -r));
            }
            else
            {
                section = elm.Geometry;
            }


            for (var i = 0; i < section.Count - 1; i++)
            {
                var v1 = new Vector(0, section[i].Y, section[i].Z);
                var v2 = new Vector(0, section[i + 1].Y, section[i + 1].Z);

                var p1 = elm.StartNode.Location + elm.TransformLocalToGlobal(v1);
                var p2 = elm.StartNode.Location + elm.TransformLocalToGlobal(v2);

                var v = elm.EndNode.Location - elm.StartNode.Location;

                if (Math.Abs(v.Z) < 0.01)
                {
                    Guid.NewGuid();
                }

                var p3 = p1 + v;
                var p4 = p2 + v;

                bldr.AddTriangle(p1, p3, p2);
                bldr.AddTriangle(p4, p2, p3);
            }
        }
        /// <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());
        }
 private void AddNode(MeshBuilder bldr, Node nde)
 {
     bldr.AddSphere(new Point3D(nde.Location.X, nde.Location.Y, nde.Location.Z),
                    ElementVisualThickness * 2, 20, 20);
 }
 private void AddMassElement(MeshBuilder bldr, ConcentratedMass elm)
 {
     bldr.AddCone(elm.Nodes[0].Location.ToPoint3D(), new Vector3D(0, 0, 1), 0, ElementVisualThickness * 2,
                  10 * ElementVisualThickness, true, true, 5);
 }