private static void AddTriangle(
            Dictionary <Point, int> mapPointVertexIndex,
            DMTTriangleBlock block,
            Point objPoint1,
            Point objPoint2,
            Point objPoint3)
        {
            int point1Index;
            int point2Index;
            int point3Index;

            if (!mapPointVertexIndex.TryGetValue(objPoint1, out point1Index))
            {
                point1Index = mapPointVertexIndex.Count;
                mapPointVertexIndex.Add(objPoint1, point1Index);
                block.AddVertex(objPoint1);
            }

            if (!mapPointVertexIndex.TryGetValue(objPoint2, out point2Index))
            {
                point2Index = mapPointVertexIndex.Count;
                mapPointVertexIndex.Add(objPoint2, point2Index);
                block.AddVertex(objPoint2);
            }

            if (!mapPointVertexIndex.TryGetValue(objPoint3, out point3Index))
            {
                point3Index = mapPointVertexIndex.Count;
                mapPointVertexIndex.Add(objPoint3, point3Index);
                block.AddVertex(objPoint3);
            }

            block.AddTriangle(point1Index, point2Index, point3Index);
        }
        /// <summary>
        /// Reads an ASCII STL file filtered by a provided filter.
        /// </summary>
        /// <param name="file">The mesh file.</param>
        /// <param name="filter">The provided filtered.</param>
        /// <returns>The DMTModel that obeys to the filter condition.</returns>
        public List <DMTModel> ReadFile(File file, IDMTModelFilter filter)
        {
            if (file.Exists == false)
            {
                throw new DMTFileException(DMTFileError.FileDoesNotExist);
            }

            var blocksIn  = new List <DMTTriangleBlock>();
            var blocksOut = new List <DMTTriangleBlock>();
            var blockIn   = new DMTTriangleBlock();
            var blockOut  = new DMTTriangleBlock();
            var vertices  = new List <Point>();

            foreach (var strLine in file.ReadTextLines())
            {
                if (strLine.Trim().StartsWith("vertex "))
                {
                    //Add position
                    var    strCoords  = strLine.Trim().Split(' ');
                    var    intCounter = 0;
                    double x          = 0;
                    double y          = 0;
                    double z          = 0;
                    foreach (var strCoord in strCoords)
                    {
                        if (Information.IsNumeric(strCoord))
                        {
                            if (intCounter == 0)
                            {
                                x = Convert.ToDouble(strCoord);
                            }
                            else if (intCounter == 1)
                            {
                                y = Convert.ToDouble(strCoord);
                            }
                            else
                            {
                                z = Convert.ToDouble(strCoord);
                            }
                            intCounter += 1;
                        }
                    }

                    vertices.Add(new Point(x, y, z));
                }
                else if (strLine.Trim().StartsWith("endloop"))
                {
                    if (filter.CanAddTriangle(vertices.ElementAt(0), vertices.ElementAt(1), vertices.ElementAt(2)))
                    {
                        blockIn.AddTriangle(vertices.ElementAt(0), vertices.ElementAt(1), vertices.ElementAt(2));
                    }
                    else
                    {
                        blockOut.AddTriangle(vertices.ElementAt(0), vertices.ElementAt(1), vertices.ElementAt(2));
                    }

                    vertices.Clear();
                }
            }

            blocksIn.Add(blockIn);
            blocksOut.Add(blockOut);

            var modelWithinFilter  = new DMTModel();
            var modelOutsideFilter = new DMTModel();

            modelWithinFilter.TriangleBlocks.AddRange(blocksIn);
            modelOutsideFilter.TriangleBlocks.AddRange(blocksOut);
            var result = new List <DMTModel>();

            result.Add(modelWithinFilter);
            result.Add(modelOutsideFilter);
            return(result);
        }