Beispiel #1
0
        //*********************************************** Дорисовка *****************************************//
        private Bitmap PaintBitmap(Bitmap btmBack, FractureLine flt)
        {
            //добавить на существующий битмап одну линию
            //нужна для временного отображения ожидаемого результата (рисования отрезка. Или 2-х отрезков, если переносится промежуточная точка
            Graphics grBack = Graphics.FromImage(btmBack);

            Point p1 = new Point();
            Point p2 = new Point();
            Pen   Ptch;

            //int mx = 1; //Масштаб по x и y
            //int my = 1;

            Ptch = new Pen(Color.LimeGreen, (float)(flt.Pero.Width + 1));
            if (flt.points.Count > 0)
            {
                p1 = flt.points[0];                        //начало рисования
            }
            for (int t = 0; t < flt.points.Count; t++)
            {
                p2 = flt.points[t];
                Rectangle r1 = new Rectangle(new Point(p2.X - (int)(Ptch.Width / 2), p2.Y - (int)(Ptch.Width / 2)), new Size((int)Ptch.Width, (int)Ptch.Width));

                grBack.DrawLine(flt.Pero, p1, p2);
                grBack.DrawEllipse(Ptch, r1);
                p1 = p2;
            }
            return(btmBack);
        }
Beispiel #2
0
        //копия линии
        public FractureLine Clone()
        {
            FractureLine f = new FractureLine();

            f.pen = (Pen)this.pen.Clone();
            for (int i = 0; i < this.points.Count; i++)
            {
                f.points.Add(this.points[i]);
            }
            return(f);
        }
Beispiel #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            //создать новую линию
            FractureLine fl_tmp = new FractureLine();

            flAddLine   = true;
            flAddPoint  = true;
            fl_tmp.Pero = p1;
            fl_tmp.Name = "Линия" + (FL.Count + 1).ToString();
            FL.Add(fl_tmp);
            IndActiveFL = FL.Count - 1;
            lbListOfLines.Items.Add(fl_tmp.Name);

            lbListOfLines.SelectedIndex = lbListOfLines.Items.Count - 1;
        }
Beispiel #4
0
        private bool OpenFile(string Path)
        {
            try
            {
                using (BinaryReader reader = new BinaryReader(File.Open(Path, FileMode.Open)))
                {
                    string info      = reader.ReadString(); //вводное инфо о файле
                    int    countLine = reader.ReadInt32();  //кол-во строк
                    FL.Clear();                             //чистим существующий список линий
                    for (int i = 0; i < countLine; i++)
                    {
                        //читаем с файла линии во временную линию
                        FractureLine fl_tmp = new FractureLine();
                        fl_tmp.Name = reader.ReadString();

                        info = reader.ReadString();           //инфо о пере для  линии
                        float PenWidth = reader.ReadSingle(); //указываем значение пера - толщина, затем цвет
                        Color PenColor = Color.FromArgb(reader.ReadInt32());
                        fl_tmp.Pero = new Pen(PenColor, PenWidth);

                        info = reader.ReadString();          //метка о начале инфо о точках
                        int countPoint = reader.ReadInt32(); //кол-во точек
                        for (int ti = 0; ti < countPoint; ti++)
                        {
                            //координаты, и добавляем точку
                            int   x  = reader.ReadInt32();
                            int   y  = reader.ReadInt32();
                            Point p1 = new Point(x, y);
                            fl_tmp.AddPoint(p1);
                        }
                        lbListOfLines.Items.Add(fl_tmp.Name);                                         //добавляем в список линию
                        FL.Add(fl_tmp);                                                               //добавляем линию в List
                    }
                    pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL); //рисуем в PictBoxe
                    reader.Close();                                                                   //закрываем файл
                }
                return(true);
            }
            catch { return(false); }
        }
Beispiel #5
0
        private void pbMainGrafWin_MouseMove(object sender, MouseEventArgs e)
        {
            //ищем наведение мышкой на какую либо линию и подсвечиваем
            if (!flAddLine && !flAddPoint && !flMoveLine && !flMovePoint)
            {
                for (int i = 0; i < FL.Count; i++)
                {
                    int ti = FL[i].InsidePoint(new Point(e.X, e.Y));
                    if (ti >= 0)
                    {
                        tsslFindLine.BackColor      = Color.LimeGreen;
                        lbListOfLines.SelectedIndex = i;
                        break;
                    }
                    else
                    {
                        //listBox1.SelectedIndex = -1;
                        tsslFindLine.BackColor = Color.Coral;
                    }
                }
            }

            if (IndActiveFL >= 0)
            {
                //работаем с активной фигурой
                FractureLine FL_tmp = new FractureLine();   //временная линия
                FL_tmp.Pero = new Pen(Color.Silver, 1);
                if (e.Button == MouseButtons.Left)
                {
                    if (flMoveLine)
                    {
                        //двигать линию
                        //созданаем копию из активной линии во временную линию, для визульного отображения будующей позиции линии
                        FL_tmp      = FL[IndActiveFL].Clone();
                        FL_tmp.Pero = new Pen(Color.Silver, 1);

                        //таскаем временную линию за мышью
                        FL_tmp.Move(e.X - PMoveBegin.X, e.Y - PMoveBegin.Y);
                        pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL);
                        pbMainGrafWin.Image = PaintBitmap((Bitmap)pbMainGrafWin.Image, FL_tmp); //дорисовываем будющее положение переносимой линии
                    }
                    if (flMovePoint)
                    {
                        //перемещаем точку в активной линии
                        if (IndActivePoint == 0)
                        {
                            //обработка перемещения первой точки
                            FL_tmp.AddPoint(new Point(e.X, e.Y));
                            FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint + 1]);
                        }
                        else if (IndActivePoint > 0 && IndActivePoint < FL[IndActiveFL].points.Count - 1)
                        {
                            //обработка перемещения излома
                            FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint - 1]);
                            FL_tmp.AddPoint(new Point(e.X, e.Y));
                            FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint + 1]);
                        }
                        else if (IndActivePoint == FL[IndActiveFL].points.Count - 1)
                        {
                            //обработка перемещения последней точки
                            FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint - 1]);
                            FL_tmp.AddPoint(new Point(e.X, e.Y));
                        }
                        pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL); //рисуем начальную картину
                        pbMainGrafWin.Image = PaintBitmap((Bitmap)pbMainGrafWin.Image, FL_tmp);           //дорисовываем будующие изменения
                    }
                }
                if (flAddPoint)
                {
                    if (FL[IndActiveFL].points.Count > 0)
                    {
                        FL_tmp.Pero    = new Pen(Color.Silver, 1);
                        IndActivePoint = FL[IndActiveFL].points.Count - 1;
                        FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint]);
                        FL_tmp.AddPoint(new Point(e.X, e.Y));
                        pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL);

                        pbMainGrafWin.Image = PaintBitmap((Bitmap)pbMainGrafWin.Image, FL_tmp); //дорисовываем предполагаемую точку + перенос линии
                    }
                }
            }
            lblCoordPB1.Text = e.X.ToString() + " : " + e.Y.ToString();  //показать координаты мышки в рабочей области
        }