public int CompareTo(DataListEntr Entr)
            {
                for (int i = 0; i < 7; i++)
                {
                    if (this.data[i] > Entr.data[i])
                    {
                        return(1);
                    }
                    if (this.data[i] < Entr.data[i])
                    {
                        return(-1);
                    }
                }

                return(0);
            }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string containerName = @"C:\Users\Nicolas\Documents\Visual Studio 2013\Projects\CameraPositionTrackingCreatorHex\PositionPatternCreator\bin\Debug\output.xps";
            string binListName   = @"C:\Users\Nicolas\Documents\Visual Studio 2013\Projects\CameraPositionTrackingCreatorHex\PositionPatternCreator\bin\Debug\output.dat";

            File.Delete(containerName);

            /*LocalPrintServer ps = new LocalPrintServer();
             * PrintQueue pq = ps.DefaultPrintQueue;
             * XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
             * PrintTicket pt = pq.UserPrintTicket;
             *
             * pt.PageOrientation = PageOrientation.Portrait;
             * PageMediaSize pageMediaSize = new PageMediaSize(DrawCanvas.ActualWidth, DrawCanvas.ActualHeight);
             * pt.PageMediaSize = pageMediaSize;
             * xpsdw.Write(DrawCanvas);*/

            FixedPage fp = new FixedPage();

            //Canvas fp = DrawCanvas;

            fp.Background = new SolidColorBrush(Color.FromRgb(0xFF, 0xFF, 0xFF));

            //Din A4
            fp.Height = 297 * mmw;
            fp.Width  = 210 * mmw;

            //Din A3
            //fp.Height = 594 * mmw;
            //fp.Width = 297 * mmw;

            int sizex = (int)((fp.Width - 30) / Dist);
            int sizey = (int)((fp.Height - 30) / Dist / ratio);


            int[,] dat = new int[sizex + 2, sizey + 2];

            int[,] xm = { { -1, -1, 0, 1, 0, -1 }, { -1, 0, 1, 0, -1, -1 }, { 0, 1, 0, -1, -1, -1 }, { 1, 0, -1, -1, -1, 0 }, { 0, -1, -1, -1, 0, 1 }, { -1, -1, -1, 0, 1, 0 } };
            int[,] ym = { { 0, -1, -1, 0, 1, 1 }, { -1, -1, 0, 1, 1, 0 }, { -1, 0, 1, 1, 0, -1 }, { 0, 1, 1, 0, -1, -1 }, { 1, 1, 0, -1, -1, 0 }, { 1, 0, -1, -1, 0, 1 } };

            List <DataListEntr> sList = new List <DataListEntr>();

            int SymCount = 0;
            int dubCount = 1;

            Random rnd = new Random(SymCount);

            for (int ix = 1; ix < sizex + 1; ix++)
            {
                for (int iy = 1; iy < sizey + 1; iy++)
                {
                    dat[ix, iy] = (rnd.Next() & 0x7) | 0x8; // (rnd.Next() & 0x7) | 0x8;
                }
            }

            int lc = 0;
            int mx = 0;

            while (dubCount > 0)
            {
                lc++;
                sList.Clear();

                for (int ix = 1; ix < sizex + 1; ix++)
                {
                    for (int iy = 1; iy < sizey + 1; iy++)
                    {
                        if (ix == 15 && iy == 4 && lc == 136)
                        {
                            iy = iy;
                        }


                        for (int i = 0; i < 6; i++)
                        {
                            DataListEntr sl = new DataListEntr();

                            sl.SetPos(ix, iy);
                            sl.SetData(0, dat[ix, iy]);
                            sl.Rotation = i;

                            bool nonNull = true;

                            for (int j = 0; j < 6; j++)
                            {
                                if (ym[j, i] != 0 && iy % 2 == 0)
                                {
                                    mx = 1;
                                }
                                else
                                {
                                    mx = 0;
                                }

                                int tmpd = dat[ix + xm[j, i] + mx, iy + ym[j, i]];
                                sl.SetData(j + 1, tmpd);
                                if (tmpd == 0)
                                {
                                    nonNull = false;
                                }
                            }

                            if (nonNull)
                            {
                                sList.Add(sl);
                            }
                        }
                    }
                }

                sList.Sort(delegate(DataListEntr X, DataListEntr Y)
                {
                    return(X.CompareTo(Y));
                });

                dubCount = 0;

                for (int i = 1; i < sList.Count; i++)
                {
                    if (sList[i].CompareTo(sList[i - 1]) == 0)
                    {
                        //System.Diagnostics.Debug.WriteLine("XY: " + sList[i+1].X + " " + sList[i+1].Y);
                        dubCount++;
                    }
                }

                if (dubCount > 0)
                {
                    for (int i = 1; i < sList.Count; i++)
                    {
                        if (sList[i].CompareTo(sList[i - 1]) == 0)
                        {
                            sList[i].SetArrayEntr(ref dat, (rnd.Next() & 0x7) | 0x8);
                        }
                    }

                    int iz = rnd.Next() % sList.Count;

                    sList[iz].SetArrayEntr(ref dat, (rnd.Next() & 0x7) | 0x8);
                }


                System.Diagnostics.Debug.WriteLine(dubCount + "  " + lc);
            }

            sList.Sort(delegate(DataListEntr X, DataListEntr Y)
            {
                return(X.CompareTo(Y));
            });

            var ListOutFile = File.OpenWrite(binListName);

            byte[] wBytes = new byte[sList.Count * 9];

            for (int i = 0; i < sList.Count; i++)
            {
                int i2 = i * 9;

                int xpos = (int)((sList[i].X * Dist + AddOffs(0, sList[i].Y)) / mmw * 10);    //in 1/10 mm
                int ypos = (int)(sList[i].Y * Dist * ratio / mmw) * 10;                       //in 1/10 mm

                wBytes[i2 + 0] = (byte)(sList[i].GetData(0));
                wBytes[i2 + 1] = (byte)((sList[i].GetData(1) << 4) | sList[i].GetData(2));
                wBytes[i2 + 2] = (byte)((sList[i].GetData(3) << 4) | sList[i].GetData(4));
                wBytes[i2 + 3] = (byte)((sList[i].GetData(5) << 4) | sList[i].GetData(6));
                wBytes[i2 + 4] = (byte)sList[i].Rotation;
                wBytes[i2 + 5] = (byte)(xpos >> 8);
                wBytes[i2 + 6] = (byte)xpos;
                wBytes[i2 + 7] = (byte)(ypos >> 8);
                wBytes[i2 + 8] = (byte)ypos;
            }

            ListOutFile.Write(wBytes, 0, wBytes.Length);

            ListOutFile.Close();


            XpsDocument xpsDoc = new XpsDocument(containerName, FileAccess.ReadWrite);

            for (int iy = 1; iy < sizey; iy++)
            {
                for (int ix = 1; ix < sizex; ix++)
                {
                    int data = dat[ix, iy];

                    for (int n = 0; n < 4; n++)
                    {
                        bool bit = ((data >> n) & 1) == 1;

                        if (bit)
                        {
                            fp.Children.Add(GetCircle(ix * Dist + AddOffs(12, iy), iy * Dist * ratio + 20, MarkerStrokeSize * (n + 1)));
                        }
                    }

                    //fp.Children.Add(GetCircle(ix, iy, MarkerStrokeSize * 5));

                    SymCount++;
                }
            }



            XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(xpsDoc);


            xpsdw.Write(fp);

            xpsDoc.Close();
        }