private void buildAction()
        {
            progValue = 0.0;
            double durTime = rlModel.Duration.TotalMilliseconds;
            Point  foPos   = new Point();
            Point  foDrct  = new Point();

            // Построение отдельно для каждой РЛС / Категории
            for (int i = 0; i < rlModel.RLSPositionList.Count; i++)
            {
                for (int j = 0; j < rlModel.RLSPositionList[i].rlsList.Count; j++)
                {
                    // Псевдонимы
                    RLS rls = rlModel.RLSPositionList[i].rlsList[j];

                    // Инициализация раскадровки для построения
                    int rfCnt = 0;
                    curRLSName = rls.Name;
                    // mainUIDispatcher.Invoke(new DispatcherDelegate(buildInit));
                    buildInit();
                    drctDiag = new DrctDiag();
                    switch (rls.DiagType)
                    {
                    case RLSDiagType.Uniform:
                    { drctDiag.uniformInit(rls.Width); } break;

                    case RLSDiagType.SinX:
                    { drctDiag.sinxInit(rls.Width); } break;
                    }
                    double curVsrAzm = rls.Visir; double prvVsrAzm = rls.Visir;
                    double progStep = 100.0 * 2 * rls.Distance /
                                      (rlModel.RLSPositionList.Count * rlModel.RLSPositionList[i].rlsList.Count *
                                       consts.LIGHT_VEL * durTime / 1000.0);
                    double strpPeriod = TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond *
                                                                  2 * rls.Distance / consts.LIGHT_VEL)).TotalMilliseconds;

                    CtgPrcs.distList = new List <DistTrace> {
                    };
                    CtgPrcs.Prepare(rls);

                    while (curPos < durTime)
                    {
                        CtgPrcs.distList.Clear();
                        // Начало нового периода
                        switch (rls.Type)
                        {
                        case RLSType.PRL: { if (rls.Ctgs[1].IsEnabled)
                                            {
                                                CtgPrcs.Ctg255PRL_BgnPrd(rls, curVsrAzm);
                                            }
                        } break;

                        case RLSType.VRL: { if (rls.Ctgs[2].IsEnabled)
                                            {
                                                CtgPrcs.Ctg255VRL_BgnPrd(rls, curVsrAzm);
                                            }
                        } break;

                        case RLSType.NRZ: { if (rls.Ctgs[2].IsEnabled)
                                            {
                                                CtgPrcs.Ctg255NRZ_BgnPrd(rls, curVsrAzm);
                                            }
                        } break;
                        }

                        // Предварительные вычисления
                        for (int l = 0; l < rlModel.FOTraceList.Count; l++)
                        {
                            // Псевдоним
                            FOTrace trace = rlModel.FOTraceList[l];
                            // Определение взаиморасположения РЛС и ВО
                            if (trace.Speed != 0.0)
                            {
                                if (curPos <= 3600000 * trace.Length / trace.Speed)
                                {
                                    trace.buildGeom.GetPointAtFractionLength(curPos / (3600000.0 * trace.Length / trace.Speed), out foPos, out foDrct);
                                }
                                else
                                {
                                    trace.buildGeom.GetPointAtFractionLength(1.0, out foPos, out foDrct);
                                }
                            }
                            else
                            {
                                trace.buildGeom.GetPointAtFractionLength(0.0, out foPos, out foDrct);
                            }

                            double range = Math.Sqrt(Math.Pow(rlModel.RLSPositionList[i].Position.X - foPos.X, 2) +
                                                     Math.Pow(rlModel.RLSPositionList[i].Position.Y - foPos.Y, 2));

                            double angle = 90.0 + Math.Atan2((foPos.Y - rlModel.RLSPositionList[i].Position.Y),
                                                             (foPos.X - rlModel.RLSPositionList[i].Position.X)) * 180.0 / Math.PI;
                            if (angle < 0.0)
                            {
                                angle += 360.0;
                            }
                            double delta = curVsrAzm - angle;
                            if (delta >= 180.0)
                            {
                                delta -= 360.0;
                            }
                            else if (delta < -180.0)
                            {
                                delta += 360.0;
                            }

                            // Список дальностей
                            switch (rls.Type)
                            {
                                #region ПРЛ
                            case RLSType.PRL:
                            {
                                if ((range < rls.Distance) &&
                                    (Math.Abs(delta) < 22.5) &&
                                    (drctDiag.form[(int)(512 * (22.5 + delta) / 45.0)] > rls.Trsh))
                                {
                                    CtgPrcs.distList.Add(new DistTrace(l, range, delta));
                                }
                            } break;
                                #endregion ПРЛ

                                #region ВРЛ/НРЗ
                            case RLSType.VRL:
                            case RLSType.NRZ:
                            {
                                if ((range < rls.Distance) &&
                                    (Math.Abs(delta) < rls.Width * 360.0 / 4096.0))
                                {
                                    CtgPrcs.distList.Add(new DistTrace(l, range, delta));
                                }
                            } break;
                                #endregion ВРЛ/НРЗ
                            }
                        }

                        // Основная обработка
                        IEnumerable <DistTrace> ordDistBfr = CtgPrcs.distList.OrderBy(da => da.Range);
                        switch (rls.Type)
                        {
                            #region ПРЛ
                        case RLSType.PRL:
                        {
                            // Обработка текущего периода
                            double        implDur = (4 / 3) * rls.StrDuration * 0.3; // в километрах
                            UInt16        curFstInd = 0; UInt16 curLstInd = 0;
                            UInt16        clsFstInd = 0; UInt16 clsLstInd = 0;
                            List <double> amplList = new List <double> {
                            };
                            for (int d = 0; d < ordDistBfr.Count(); d++)
                            {
                                // Псевдонимы
                                DistTrace dt    = ordDistBfr.ElementAt(d);
                                FOTrace   trace = rlModel.FOTraceList[dt.TraceIndex];

                                int    ai   = (int)(512 * (22.5 + dt.Delta) / 45.0);
                                double ampl = drctDiag.form[ai];
                                curFstInd = (UInt16)Math.Ceiling(((dt.Range + (rls.Trsh / ampl) * (implDur / 4)) / consts.DSC));
                                curLstInd = (UInt16)Math.Floor(((dt.Range + implDur - (rls.Trsh / ampl) * (implDur / 4)) / consts.DSC));

                                if (amplList.Count == 0)
                                {
                                    for (int q = curFstInd; q <= curLstInd; q++)
                                    {
                                        amplList.Add(ampl * StrpForm(q * consts.DSC - dt.Range, implDur));
                                    }
                                    clsFstInd = curFstInd; clsLstInd = curLstInd;
                                }
                                else
                                {
                                    if (curFstInd > clsLstInd + 1)
                                    {
                                        // Выдача данных
                                        if (rls.Ctgs[0].IsEnabled)
                                        {
                                            CtgPrcs.Ctg107PRL_CrtPrd(rls, clsFstInd, clsLstInd, curVsrAzm);
                                        }
                                        if (rls.Ctgs[1].IsEnabled)
                                        {
                                            CtgPrcs.Ctg255PRL_CrtPrd(rls, clsFstInd, amplList);
                                        }

                                        // Очистка буфера амплитуд
                                        amplList.Clear();

                                        for (int q = curFstInd; q <= curLstInd; q++)
                                        {
                                            amplList.Add(ampl * StrpForm(q * consts.DSC - dt.Range, implDur));
                                        }
                                        clsFstInd = curFstInd; clsLstInd = curLstInd;
                                    }
                                    else
                                    {
                                        // Наложение амплитуд
                                        for (int q = curFstInd; q <= curLstInd; q++)
                                        {
                                            if (q - clsFstInd < amplList.Count)
                                            {
                                                double a = Math.Sqrt(Math.Pow(amplList[q - clsFstInd], 2) +
                                                                     Math.Pow(ampl * StrpForm(q * consts.DSC - ordDistBfr.ElementAt(d).Range, implDur), 2));
                                                if (a <= 100.0)
                                                {
                                                    amplList[q - clsFstInd] = a;
                                                }
                                                else
                                                {
                                                    amplList[q - clsFstInd] = 100.0;
                                                }
                                            }
                                            else
                                            {
                                                amplList.Add(ampl * StrpForm(q * consts.DSC - ordDistBfr.ElementAt(d).Range, implDur));
                                            }
                                        }
                                        if (curLstInd > clsLstInd)
                                        {
                                            clsLstInd = curLstInd;
                                        }
                                    }
                                }

                                if (d == ordDistBfr.Count() - 1)
                                {
                                    // Выдача данных
                                    if (rls.Ctgs[0].IsEnabled)
                                    {
                                        CtgPrcs.Ctg107PRL_CrtPrd(rls, clsFstInd, clsLstInd, curVsrAzm);
                                    }
                                    if (rls.Ctgs[1].IsEnabled)
                                    {
                                        CtgPrcs.Ctg255PRL_CrtPrd(rls, clsFstInd, amplList);
                                    }

                                    // Очистка буфера амплитуд
                                    amplList.Clear();
                                }
                            }

                            // Завершение текущего периода
                            if (rls.Ctgs[1].IsEnabled)
                            {
                                CtgPrcs.Ctg255PRL_EndPrd(rls, curPos, rlModel.SyncDoub);
                            }

                            // Завершение текущего сектора
                            if ((rls.Ctgs[0].IsEnabled) &&
                                ((byte)(curVsrAzm / consts.SCT_WDT) !=
                                 (byte)(prvVsrAzm / consts.SCT_WDT)))
                            {
                                CtgPrcs.Ctg107PRL_EndSct(rls, curVsrAzm, curPos, rlModel.SyncDoub);
                            }
                        } break;
                            #endregion ПРЛ

                            #region ВРЛ
                        case RLSType.VRL:
                        {
                            // Обработка текущего периода
                            for (int d = 0; d < ordDistBfr.Count(); d++)
                            {
                                // Псевдоним
                                DistTrace dt = ordDistBfr.ElementAt(d);
                                // Выдача данных
                                if (rls.Ctgs[2].IsEnabled)
                                {
                                    CtgPrcs.Ctg255VRL_CrtPrd(rls,
                                                             rlModel.FOTraceList[dt.TraceIndex],
                                                             (UInt16)(dt.Range * 40),
                                                             curPos);
                                }
                            }
                            // Завершение текущего периода
                            if (rls.Ctgs[2].IsEnabled)
                            {
                                CtgPrcs.Ctg255VRL_EndPrd(rls,
                                                         curPos,
                                                         rlModel.SyncDoub);
                            }
                        } break;
                            #endregion ВРЛ

                            #region НРЗ
                        case RLSType.NRZ:
                        {
                            // Обработка текущего периода
                            for (int d = 0; d < ordDistBfr.Count(); d++)
                            {
                                // Псевдоним
                                DistTrace dt = ordDistBfr.ElementAt(d);
                                // Выдача данных
                                if (rls.Ctgs[2].IsEnabled)
                                {
                                    CtgPrcs.Ctg255NRZ_CrtPrd(rls,
                                                             rlModel.FOTraceList[dt.TraceIndex],
                                                             (UInt16)(dt.Range * 40),
                                                             curPos);
                                }
                            }
                            // Завершение текущего периода
                            if (rls.Ctgs[2].IsEnabled)
                            {
                                CtgPrcs.Ctg255NRZ_EndPrd(rls,
                                                         curPos,
                                                         rlModel.SyncDoub);
                            }
                        } break;
                            #endregion НРЗ
                        }

                        // Шаг вперед
                        curPos    += strpPeriod;
                        progValue += progStep;
                        prvVsrAzm  = curVsrAzm;
                        curVsrAzm += 360.0 * rlModel.RLSPositionList[i].rlsList[j].Rate * strpPeriod / 60000;
                        if (curVsrAzm >= 360.0)
                        {
                            curVsrAzm -= 360.0;
                        }

                        if (rfCnt < int.MaxValue)
                        {
                            rfCnt++;
                        }
                        else
                        {
                            rfCnt = 0;
                        }
                        if (rfCnt % 1000 == 0)
                        {
                            mainUIDispatcher.Invoke(new DispatcherDelegate(buildUpdate));
                        }
                    }
                }
            }

            #region Сборка общего потока кодограмм
            cdgStream = new CdgStream();
            for (int i = 0; i < rlModel.RLSPositionList.Count; i++)
            {
                for (int j = 0; j < rlModel.RLSPositionList[i].rlsList.Count; j++)
                {
                    for (int k = 0; k < rlModel.RLSPositionList[i].rlsList[j].Ctgs.LongLength; k++)
                    {
                        if (rlModel.RLSPositionList[i].rlsList[j].Ctgs[k].IsEnabled)
                        {
                            cdgStream.ctgEPList.Add(
                                new System.Net.IPEndPoint(rlModel.RLSPositionList[i].rlsList[j].Ctgs[k].EndPoint.Address,
                                                          rlModel.RLSPositionList[i].rlsList[j].Ctgs[k].EndPoint.Port));
                            #region Построение имени категории
                            string ctgName = rlModel.RLSPositionList[i].rlsList[j].Name + " - ";
                            switch (rlModel.RLSPositionList[i].rlsList[j].Type)
                            {
                            case RLSType.PRL:
                            {
                                switch (k)
                                {
                                case 0: { ctgName += "Категория 107"; } break;

                                case 1: { ctgName += "Категория 255"; } break;
                                }
                            } break;

                            case RLSType.VRL:
                            {
                                switch (k)
                                {
                                case 0: { ctgName += "Категория 1"; } break;

                                case 1: { ctgName += "Категория 2"; } break;
                                }
                            } break;

                            case RLSType.NRZ:
                            {
                                switch (k)
                                {
                                case 0: { ctgName += "Категория 1"; } break;

                                case 1: { ctgName += "Категория 2"; } break;
                                }
                            } break;
                            }
                            #endregion
                            cdgStream.ctgNameList.Add(ctgName);
                            rlModel.RLSPositionList[i].rlsList[j].Ctgs[k].CdgInd = 0;
                        }
                    }
                }
            }
            bool notRdy = true;
            while (notRdy)
            {
                notRdy = false;
                int[] sel = new int[3] {
                    -1, -1, -1
                };
                int    chCnt  = -1;
                int    selCh  = -1;
                double minPos = double.MaxValue;
                for (int i = 0; i < rlModel.RLSPositionList.Count; i++)
                {
                    for (int j = 0; j < rlModel.RLSPositionList[i].rlsList.Count; j++)
                    {
                        for (int k = 0; k < rlModel.RLSPositionList[i].rlsList[j].Ctgs.Length; k++)
                        {
                            Category ctg = rlModel.RLSPositionList[i].rlsList[j].Ctgs[k];
                            if (ctg.IsEnabled)
                            {
                                chCnt++;
                            }
                            if (ctg.CdgInd != ctg.CdgList.Count)
                            {
                                notRdy = true;
                                if (ctg.CdgList[ctg.CdgInd].pos < minPos)
                                {
                                    sel[0] = i; sel[1] = j; sel[2] = k;
                                    selCh  = chCnt;
                                    minPos = ctg.CdgList[ctg.CdgInd].pos;
                                }
                            }
                        }
                    }
                }
                if (sel[0] != -1)
                {
                    if (selCh < consts.MAX_CDG_CHN)
                    {
                        cdgStream.cdgList.Add(new StrmCdg(rlModel.RLSPositionList[sel[0]].rlsList[sel[1]].Ctgs[sel[2]].CdgList[rlModel.RLSPositionList[sel[0]].rlsList[sel[1]].Ctgs[sel[2]].CdgInd],
                                                          selCh));
                    }
                    rlModel.RLSPositionList[sel[0]].rlsList[sel[1]].Ctgs[sel[2]].CdgInd++;
                }
            }
            #endregion Сборка общего потока кодограмм

            // Отображение готовности
            curPos    = durTime;
            progValue = 100.0;
            mainUIDispatcher.Invoke(new DispatcherDelegate(buildUpdate));

            // Остановка после проигрывания
            mainUIDispatcher.Invoke(new DispatcherDelegate(buildRestore));
        }
            public static void Prepare(RLS rls)
            {
                for (int i = 0; i < rls.Ctgs.Length; i++)
                {
                    if (rls.Ctgs[i].IsEnabled)
                    {
                        switch (rls.Type)
                        {
                        case RLSType.PRL:
                        {
                            switch (i)
                            {
                            // Категория 107 ПРЛ
                            case 0:
                            {
                                rls.Ctgs[0].Cdg     = new byte[consts.MAX_CDG_LENGTH];
                                rls.Ctgs[0].CdgList = new List <Cdg> {
                                };
                                rls.Ctgs[0].Cdg[0]  = 0xAA;
                                rls.Ctgs[0].Cdg[1]  = 0x02;
                                rls.Ctgs[0].Cdg[2]  = 107;
                                rls.Ctgs[0].Cdg[3]  = 0x00;
                                rls.Ctgs[0].Cdg[4]  = 0x00;
                                rls.Ctgs[0].CdgInd  = 5;
                            } break;

                            // Категория 255 ПРЛ
                            case 1:
                            {
                                // Шапка
                                rls.Ctgs[1].Cdg     = new byte[consts.MAX_CDG_LENGTH];
                                rls.Ctgs[1].CdgList = new List <Cdg> {
                                };
                                rls.Ctgs[1].Cdg[0]  = 0xAA;
                                rls.Ctgs[1].Cdg[1]  = 0x02;
                                rls.Ctgs[1].Cdg[2]  = 255;
                                rls.Ctgs[1].Cdg[3]  = 0x00;
                                rls.Ctgs[1].Cdg[4]  = 0x00;
                                // Идентификатор канала
                                rls.Ctgs[1].Cdg[5] = (byte)(rls.ChNmb);
                                // Инициализация номера кадра
                                // (с учетом инкремента)
                                rls.Ctgs[1].Cdg[6] = 0xFF;
                                rls.Ctgs[1].Cdg[7] = 0xFF;
                            } break;

                            // Категория не используется
                            case 2:
                            {
                            } break;
                            }
                        } break;

                        case RLSType.VRL:
                        {
                            switch (i)
                            {
                            // Категория 1 ВРЛ
                            case 0:
                            {
                            } break;

                            // Категория 2 ВРЛ
                            case 1:
                            {
                            } break;

                            // Категория 255 ВРЛ
                            case 2:
                            {
                                // Шапка
                                rls.Ctgs[2].Cdg     = new byte[consts.MAX_CDG_LENGTH];
                                rls.Ctgs[2].CdgList = new List <Cdg> {
                                };
                                rls.Ctgs[2].Cdg[0]  = 0xAA;
                                rls.Ctgs[2].Cdg[1]  = 0x02;
                                rls.Ctgs[2].Cdg[2]  = 255;
                                rls.Ctgs[2].Cdg[3]  = 0x00;
                                rls.Ctgs[2].Cdg[4]  = 0x00;
                                // Идентификатор канала
                                rls.Ctgs[2].Cdg[5] = (byte)(0x05 + rls.ChNmb);
                                // Инициализация номера кадра
                                // (с учетом инкремента)
                                rls.Ctgs[2].Cdg[6] = 0xFF;
                                rls.Ctgs[2].Cdg[7] = 0xFF;
                            } break;
                            }
                        } break;

                        case RLSType.NRZ:
                        {
                            switch (i)
                            {
                            // Категория 1 НРЗ
                            case 0:
                            {
                            } break;

                            // Категория 2 НРЗ
                            case 1:
                            {
                            } break;

                            // Категория 255 НРЗ
                            case 2:
                            {
                                // Шапка
                                rls.Ctgs[2].Cdg     = new byte[consts.MAX_CDG_LENGTH];
                                rls.Ctgs[2].CdgList = new List <Cdg> {
                                };
                                rls.Ctgs[2].Cdg[0]  = 0xAA;
                                rls.Ctgs[2].Cdg[1]  = 0x02;
                                rls.Ctgs[2].Cdg[2]  = 255;
                                rls.Ctgs[2].Cdg[3]  = 0x00;
                                rls.Ctgs[2].Cdg[4]  = 0x00;
                                // Идентификатор канала
                                rls.Ctgs[2].Cdg[5] = (byte)(0x03 + rls.ChNmb);
                                // Инициализация номера кадра
                                // (с учетом инкремента)
                                rls.Ctgs[2].Cdg[6] = 0xFF;
                                rls.Ctgs[2].Cdg[7] = 0xFF;
                            } break;
                            }
                        } break;
                        }
                    }
                }
            }
Пример #3
0
        public bool Set(RLS rls)
        {
            this.Name = rls.Name;
            switch (rls.Type)
            {
            case RLSType.PRL: { this.Type = 0; } break;

            case RLSType.VRL: { this.Type = 1; } break;

            case RLSType.NRZ: { this.Type = 2; } break;
            }
            this.ChNmb = rls.ChNmb;
            switch (rls.ReqSignal)
            {
            case RLSReqSignal.IndvNumb: { this.ReqSignal = 0; } break;

            case RLSReqSignal.HT: { this.ReqSignal = 1; } break;
            }

            this.Distance = rls.Distance;

            if (rls.DStep == 50.0)
            {
                this.DStep = 0;
            }
            else if (rls.DStep == 100.0)
            {
                this.DStep = 1;
            }
            else if (rls.DStep == 150.0)
            {
                this.DStep = 2;
            }
            else if (rls.DStep == 200.0)
            {
                this.DStep = 3;
            }
            else
            {
                return(false);
            }

            if (rls.AStep == 15.0)
            {
                this.AStep = 0;
            }
            else if (rls.AStep == 30.0)
            {
                this.AStep = 1;
            }
            else if (rls.AStep == 45.0)
            {
                this.AStep = 2;
            }
            else if (rls.AStep == 90.0)
            {
                this.AStep = 3;
            }
            else
            {
                return(false);
            }

            this.Rate = rls.Rate;

            this.Width = rls.Width;
            this.Trsh  = rls.Trsh;

            this.Visir = rls.Visir;

            if (rls.DiagType == RLSDiagType.Uniform)
            {
                this.DiagType = 0;
            }
            else if (rls.DiagType == RLSDiagType.SinX)
            {
                this.DiagType = 1;
            }
            else
            {
                return(false);
            }

            this.StrDuration = rls.StrDuration;
            rls.StatNRZ.CopyTo(this.statNRZ, 0);

            for (int i = 0; i < consts.MAX_CTG; i++)
            {
                this.ctgEn[i]     = rls.Ctgs[i].IsEnabled;
                this.ipAddress[i] = rls.Ctgs[i].EndPoint.Address.ToString();
                this.ipPort[i]    = rls.Ctgs[i].EndPoint.Port.ToString();
            }
            return(true);
        }
        public void RLSList_Set(ref ListBoxItem lbi, RLS rls)
        {
            Thickness thick = new Thickness(5.0);
            Grid      gr    = new Grid();

            gr.ColumnDefinitions.Add(new ColumnDefinition());
            gr.ColumnDefinitions[0].Width = new GridLength(2.0, GridUnitType.Star);
            gr.ColumnDefinitions.Add(new ColumnDefinition());
            gr.ColumnDefinitions[1].Width = new GridLength(0.7, GridUnitType.Star);
            gr.ColumnDefinitions.Add(new ColumnDefinition());
            gr.ColumnDefinitions[2].Width = new GridLength(0.7, GridUnitType.Star);
            gr.ColumnDefinitions.Add(new ColumnDefinition());
            gr.ColumnDefinitions[3].Width = new GridLength(1.0, GridUnitType.Star);
            gr.ColumnDefinitions.Add(new ColumnDefinition());
            gr.ColumnDefinitions[4].Width = new GridLength(1.0, GridUnitType.Star);
            gr.HorizontalAlignment        = HorizontalAlignment.Stretch;
            gr.ShowGridLines = true;

            TextBlock nameTextBlock = new TextBlock();

            nameTextBlock.Text   = rls.Name;
            nameTextBlock.Margin = thick;
            Grid.SetColumn(nameTextBlock, 0);

            TextBlock typeTextBlock = new TextBlock();

            switch (rls.Type)
            {
            case RLSType.PRL: { typeTextBlock.Text = "ПРЛ"; }; break;

            case RLSType.VRL: { typeTextBlock.Text = "ВРЛ"; }; break;

            case RLSType.NRZ: { typeTextBlock.Text = "НРЗ"; }; break;
            }
            typeTextBlock.Margin = thick;
            Grid.SetColumn(typeTextBlock, 1);

            TextBlock distTextBlock = new TextBlock();

            distTextBlock.Text   = rls.Distance.ToString() + " км";
            distTextBlock.Margin = thick;
            Grid.SetColumn(distTextBlock, 2);

            Button grdColorButton = new Button();

            grdColorButton.Background = Brushes.DarkGreen;
            grdColorButton.Margin     = thick;
            Grid.SetColumn(grdColorButton, 3);
            grdColorButton.Click += new RoutedEventHandler(ColorButton_Click);

            Button vsrColorButton = new Button();

            vsrColorButton.Background = Brushes.White;
            vsrColorButton.Margin     = thick;
            Grid.SetColumn(vsrColorButton, 4);
            vsrColorButton.Click += new RoutedEventHandler(ColorButton_Click);

            gr.Children.Add(nameTextBlock);
            gr.Children.Add(typeTextBlock);
            gr.Children.Add(distTextBlock);
            gr.Children.Add(grdColorButton);
            gr.Children.Add(vsrColorButton);

            lbi.Content = gr;
        }