Пример #1
0
        private GeometryExtents <double> AddLayer(MRecipe recipe, MRecipeDeviceLayer layer)
        {
            var extents = GeometryExtents <double> .CreateDefaultDouble();

            // calculate layer's transform
            var transform = MRecipe.GetRelativeTransform(recipe, layer);

            // fetch geometries from pattern file
            var geometries = _fetchDxfFunc(layer.PatternFilePath);

            for (int i = 0; i < geometries?.Count; i++)
            {
                var clone = (IMarkGeometry)geometries[i].Clone();
                clone.Transform(transform);

                // render geometry
                AddDefault(
                    clone,
                    DefaultColor
                    );

                // update extents
                extents = GeometryExtents <double> .Combine(
                    extents,
                    clone.Extents
                    );
            }

            return(extents);
        }
Пример #2
0
        /// <summary>
        ///     Get geometries in DXF file.
        /// </summary>
        /// <param name="callback">An action to consume geometries as they are read from the file.</param>
        /// <param name="howmany">Howmany geometries to read</param>
        /// <returns>Returns a count and Extents of the geometries consumed.</returns>
        public (int Count, GeometryExtents <double> Extents) BeginGetGeometries(Action <string, IMarkGeometry> callback, int howmany = int.MaxValue)
        {
            _count  = 0;
            howmany = howmany < 0 ? int.MaxValue : howmany;
            var extents = GeometryExtents <double> .CreateDefaultDouble();

            using (var reader = new AdvancedLineStreamReader(_filePath))
            {
                string layerName;
                List <IMarkGeometry> geometries = null;

                while (
                    !reader.EndOfStream &&
                    _count < howmany
                    )
                {
                    (layerName, geometries) = ParseEntity(reader);

                    if (geometries != null)
                    {
                        foreach (var geometry in geometries)
                        {
                            _count += 1;
                            extents = GeometryExtents <double> .Combine(extents, geometry.Extents);

                            callback((layerName == null) ? "0" : layerName, geometry);
                        }
                    }
                }
            }

            return(_count, extents);
        }
Пример #3
0
 private static void PrintExtents(string tag, GeometryExtents <double> extents)
 {
     Console.WriteLine($"\n{tag}");
     Console.WriteLine($"Centre: {Math.Round(extents.Centre.X, 4)}, {Math.Round(extents.Centre.Y, 4)}");
     Console.WriteLine($"Size: {Math.Round(extents.Width, 4)}, {Math.Round(extents.Height, 4)}");
     Console.WriteLine($"Extents: {extents}");
 }
Пример #4
0
        public void GenerateTileDescriptionsFromSettings(GeometryExtents <double> extentsIn)
        {
            TileDescriptions.Clear();

            if (!File.Exists(PatternFilePath))
            {
                return;
            }

            // generate tile
            TileDescriptions = new ObservableCollection <MTileDescription>(
                MTileSettings.ToTiles(TileSettings, extentsIn)
                );
        }
Пример #5
0
        public virtual void AddRecipeNode(MRecipe recipe, MRecipeBaseNode recipeNode)
        {
            if (recipe == null || recipeNode == null)
            {
                return;
            }

            var extents = GeometryExtents <double> .CreateDefaultDouble();

            MRecipe.BeginGetAllLayers_Parallel(recipeNode, (layer) =>
            {
                extents = GeometryExtents <double> .Combine(
                    extents,
                    AddLayer(recipe, layer)
                    );
            });

            // calculate size of fiducial relative to the node
            var fiducialSize = 0.025 * extents.Hypotenuse;

            // generate fiducial pattern
            GenerateFiducialPattern(fiducialSize);

            // get node's transform
            var parentsTransform = (recipeNode.Parent as MRecipeBaseNode)?.TransformInfo.ToMatrix4x4() ?? GeometricArithmeticModule.GetDefaultTransformationMatrix();

            // render fiducials in parent's reference frame
            foreach (var fiducial in recipeNode.Fiducials)
            {
                var transform = GeometricArithmeticModule.CombineTransformations(
                    GeometricArithmeticModule.GetTranslationTransformationMatrix(
                        fiducial.X, fiducial.Y, fiducial.Z
                        ),
                    parentsTransform
                    );

                foreach (var geometry in _fiducialPattern)
                {
                    var clone = (IMarkGeometry)geometry.Clone();
                    clone.Transform(transform);
                    AddDefault(clone, FiducialColor);
                }
            }
        }
Пример #6
0
        public MSTLSlice()
        {
            // refers to the total number of joints in the
            // given contours. Currently used to estimate
            // the effects of the polygon delay.
            NumberOfJoints = 0;

            // refers to the sum of all jumps required to
            // mark this pattern.
            _totalContourJumpDistance = 0;
            _totalHatchesJumpDistance = 0;

            NumberOfContours          = 0;
            _totalContourMarkDistance = 0;
            _totalHatchesMarkDistance = 0;
            MinVectorLength           = double.MaxValue;
            ContourLines = new List <MarkGeometryLine>();
            HatchLines   = new List <MarkGeometryLine>();
            Tiles        = new List <MarkGeometryRectangle>();
            Extents      = new GeometryExtents <double>();
        }
Пример #7
0
        public static List <MTileDescription> ToTiles(MTileSettings tileSettings, GeometryExtents <double> extents)
        {
            var tiles = new List <MTileDescription>();

            double refWidth  = extents.Width + tileSettings.XPadding;
            double refHeight = extents.Height + tileSettings.YPadding;

            int nRows    = (int)Math.Ceiling(refHeight / tileSettings.YSize);
            int nColumns = (int)Math.Ceiling(refWidth / tileSettings.XSize);

            var _halfTileWidth  = 0.5 * tileSettings.XSize;
            var _halfTileHeight = 0.5 * tileSettings.YSize;
            var _centre         = extents.Centre - new MarkGeometryPoint(0.5 * (nColumns * tileSettings.XSize), 0.5 * (nRows * tileSettings.YSize));

            int counter = 0;

            for (int row = 0; row < nRows; row++)
            {
                for (int col = 0; col < nColumns; col++)
                {
                    var centrePoint = new MarkGeometryPoint(
                        (col * tileSettings.XSize) + _halfTileWidth,
                        (row * tileSettings.YSize) + _halfTileHeight
                        );

                    GeometricArithmeticModule.Translate(centrePoint, _centre.X + tileSettings.XOffset, _centre.Y + tileSettings.YOffset);

                    tiles.Add(
                        new MTileDescription(
                            counter++, centrePoint.X, centrePoint.Y, tileSettings.XSize, tileSettings.YSize
                            )
                        );
                }
            }

            return(tiles);
        }
Пример #8
0
        public virtual void AddDefault(IList <IMarkGeometry> geometriesIn, double[] color)
        {
            if (geometriesIn == null || color == null || color.Length < 3)
            {
                AddDefault(geometriesIn);
                return;
            }

            if (geometriesIn.All(x => x is MarkGeometryPoint))
            {
                var currentExtents = GeometryExtents <double> .Combine(
                    new GeometryExtents <double>()
                {
                    MinX = MinX,
                    MaxX = MaxX,
                    MinY = MinY,
                    MaxY = MaxY
                },
                    GeometricArithmeticModule.CalculateExtents(
                        geometriesIn
                        )
                    );

                // Update extents
                MinX = currentExtents.MinX;
                MaxX = currentExtents.MaxX;
                MinY = currentExtents.MinY;
                MaxY = currentExtents.MaxY;

                // Update Counter
                Count += geometriesIn.Count;

                var vtx = new VertexGroup()
                {
                    Color = color
                };

                for (int i = 0; i < geometriesIn.Count; i++)
                {
                    vtx.Vertices.AddRange(ToDouble(geometriesIn[i] as MarkGeometryPoint));
                }

                _points.Add(vtx);
                Update();
            }
            else if (geometriesIn.All(x => x is MarkGeometryLine))
            {
                var currentExtents = GeometryExtents <double> .Combine(
                    new GeometryExtents <double>()
                {
                    MinX = MinX,
                    MaxX = MaxX,
                    MinY = MinY,
                    MaxY = MaxY
                },
                    GeometricArithmeticModule.CalculateExtents(
                        geometriesIn
                        )
                    );

                // Update extents
                MinX = currentExtents.MinX;
                MaxX = currentExtents.MaxX;
                MinY = currentExtents.MinY;
                MaxY = currentExtents.MaxY;

                // Update Counter
                Count += geometriesIn.Count;

                var vtx = new VertexGroup()
                {
                    Color = color
                };

                for (int i = 0; i < geometriesIn.Count; i++)
                {
                    vtx.Vertices.AddRange(ToDouble(geometriesIn[i] as MarkGeometryLine));
                }

                _lines.Add(vtx);
                Update();
            }
            else
            {
                for (int i = 0; i < geometriesIn.Count; i++)
                {
                    AddDefault(geometriesIn[i], color);
                }
            }
        }
Пример #9
0
        public void Render()
        {
            _terminableTaskExecutor.CancelCurrentAndRun(
                (ctIn) =>
            {
                // reset shader
                MShader.Reset();

                if (_geometriesBuffer != null)
                {
                    int count   = 0;
                    var extents = GeometryExtents <double> .CreateDefaultDouble();
                    foreach (var layerName in _geometriesBuffer.Keys)
                    {
                        MShader.AddDefault(
                            _geometriesBuffer[layerName],
                            _colours[(count++) % _colours.Length]
                            );

                        extents = GeometryExtents <double> .Combine(
                            extents, GeometricArithmeticModule.CalculateExtents(_geometriesBuffer[layerName])
                            );
                    }

                    // overlay tiles
                    foreach (var tile in MTileSettings.ToTiles(TileSettings, extents))
                    {
                        MShader.AddDefault((MarkGeometryRectangle)tile, _tileColor);
                    }

                    // calculate size of fiducial relative to the node
                    var fiducialSize = 0.05 * extents.Hypotenuse;

                    // generate fiducial pattern
                    GenerateFiducialPattern(fiducialSize);

                    // get base transform
                    var baseTransform = GeometricArithmeticModule.GetTranslationTransformationMatrix(
                        extents.Centre.X, extents.Centre.Y
                        );

                    // render fiducials in parent's reference frame
                    foreach (var fiducial in Fiducials)
                    {
                        var transform = GeometricArithmeticModule.CombineTransformations(
                            baseTransform,
                            GeometricArithmeticModule.GetTranslationTransformationMatrix(
                                fiducial.X, fiducial.Y, fiducial.Z
                                )
                            );

                        foreach (var geometry in _fiducialPattern)
                        {
                            var clone = (IMarkGeometry)geometry.Clone();
                            clone.Transform(transform);
                            MShader.AddDefault(clone, _fiducialColor);
                        }
                    }
                }

                // stop if new render is requested
                ctIn.ThrowIfCancellationRequested();

                MShader.Render();

                DrawingExtentsX = MShader.Width;
                DrawingExtentsY = MShader.Height;
                DrawingCount    = MShader.Count;
            }
                );
        }