Пример #1
0
        public void Salvar(string nomeArq)
        {
            StreamWriter arq = new StreamWriter(nomeArq);

            var atual = objetos.primeiro;

            while (atual != null)
            {
                if (atual.info.GetType().Equals(typeof(Circulo)))
                {
                    Circulo circ = atual.info as Circulo;
                    arq.WriteLine(circ.ToString());
                }
                else
                if (atual.info.GetType().Equals(typeof(Retangulo)))
                {
                    Retangulo ret = atual.info as Retangulo;
                    arq.WriteLine(ret.ToString());
                }
                else
                if (atual.info.GetType().Equals(typeof(Linha)))
                {
                    Linha lin = atual.info as Linha;
                    arq.WriteLine(lin.ToString());
                }
                else
                if (atual.info.GetType().Equals(typeof(Elipse)))
                {
                    Elipse el = atual.info as Elipse;
                    arq.WriteLine(el.ToString());
                }
                atual = atual.prox;
            }
            arq.Close();
        }
Пример #2
0
        private void pbAreaDesenho_MouseUp(object sender, MouseEventArgs e)
        {
            var posCursor = new Ponto(e.X, e.Y);

            switch (selTool)
            {
            case "circulo":
                if (!pontos.estaVazia())
                {
                    pontos = new ListaSimples <Ponto>();
                    drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                    //salvo.Save("imagem.bmp");
                    pbAreaDesenho.Image = salvo;
                    //salvo = drawArea.Context.Save();
                }
                break;

            case "retangulo":
                if (!pontos.estaVazia())
                {
                    pontos = new ListaSimples <Ponto>();
                    drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                    pbAreaDesenho.Image = salvo;
                }
                break;

            case "linha":
                if (!pontos.estaVazia())
                {
                    pontos = new ListaSimples <Ponto>();
                    drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                    pbAreaDesenho.Image = salvo;
                }
                break;

            case "desenho livre":
                if (!pontos.estaVazia())
                {
                    pontos = new ListaSimples <Ponto>();
                    drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                    pbAreaDesenho.Image = salvo;
                }
                break;

            case "elipse":
                if (!pontos.estaVazia())
                {
                    pontos = new ListaSimples <Ponto>();
                    drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                    pbAreaDesenho.Image = salvo;
                }
                break;

            case "selecao":
                if (!pontos.estaVazia())
                {
                    selecionados = new ListaSimples <Figura>();
                    var  pInicial = new Ponto(Math.Min(pontos.ultimo.info.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Min(pontos.ultimo.info.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    var  pFinal   = new Ponto(Math.Max(pontos.ultimo.info.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Max(pontos.ultimo.info.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    var  r        = new Retangulo(pInicial, Math.Abs(pFinal.X - pInicial.X), Math.Abs(pFinal.Y - pInicial.Y));
                    var  atual    = drawArea.Objetos.primeiro;
                    bool contem;
                    while (atual != null)
                    {
                        contem = true;
                        switch (atual.info.GetType().ToString())
                        {
                        case "pEditorGrafico.Retangulo":
                            foreach (Ponto p in (atual.info as Retangulo).Vertices)
                            {
                                if (!r.Contem(p))
                                {
                                    contem = false;
                                    break;
                                }
                            }
                            if (contem)
                            {
                                selecionados.insereAposFim(new NoLista <Figura>(atual.info, null));
                            }
                            statusDesenho.Text = "Contem:" + contem;
                            break;

                        case "pEditorGrafico.Circulo":
                            var lados = r.GetLados();
                            foreach (Linha l in lados)
                            {
                                var dist = (atual.info as Circulo).GetCentro().GetDistancia(l);
                                if ((atual.info as Circulo).Raio > dist)
                                {
                                    contem = false;
                                    break;
                                }
                            }
                            contem = contem && r.Contem((atual.info as Circulo).GetCentro());
                            if (contem)
                            {
                                selecionados.insereAposFim(new NoLista <Figura>(atual.info, null));
                            }
                            statusDesenho.Text = "Contem:" + contem;
                            break;

                        case "pEditorGrafico.Linha":
                            contem = (r.Contem((atual.info as Linha).PontoInicio) && r.Contem((atual.info as Linha).PontoFim));
                            if (contem)
                            {
                                selecionados.insereAposFim(new NoLista <Figura>(atual.info, null));
                            }
                            statusDesenho.Text = "Contem:" + contem;
                            break;

                        case "pEditorGrafico.Ponto":
                            contem = (r.Contem(atual.info as Ponto));
                            if (contem)
                            {
                                selecionados.insereAposFim(new NoLista <Figura>(atual.info, null));
                            }
                            statusDesenho.Text = "Contem:" + contem;
                            break;

                        case "pEditorGrafico.Polilinha":
                            var poli    = (atual.info as Polilinha);
                            var vertice = poli.Vertices.primeiro;
                            while (vertice != null)
                            {
                                if (!r.Contem(vertice.info))
                                {
                                    contem = false;
                                    break;
                                }
                                vertice = vertice.prox;
                            }
                            if (contem)
                            {
                                selecionados.insereAposFim(new NoLista <Figura>(atual.info, null));
                            }
                            statusDesenho.Text = "Contem:" + contem;
                            break;

                        case "pEditorGrafico.Elipse":
                            Ponto[] ladosEl;
                            ladosEl = new Ponto[4];
                            var el = (atual.info as Elipse);
                            ladosEl[0] = new Ponto(el.Posicao.X + el.Largura / 2, el.Posicao.Y);
                            ladosEl[1] = new Ponto(el.Posicao.X + el.Largura, el.Posicao.Y + el.Altura / 2);
                            ladosEl[2] = new Ponto(el.Posicao.X + el.Largura / 2, el.Posicao.Y + el.Altura);
                            ladosEl[3] = new Ponto(el.Posicao.X, el.Posicao.Y + el.Altura / 2);
                            foreach (Ponto p in ladosEl)
                            {
                                if (!r.Contem(p))
                                {
                                    contem = false;
                                    break;
                                }
                            }
                            if (contem)
                            {
                                selecionados.insereAposFim(new NoLista <Figura>(atual.info, null));
                            }
                            statusDesenho.Text = "Contem:" + contem;
                            break;
                        }
                        atual = atual.prox;
                    }
                    pontos = new ListaSimples <Ponto>();
                    if (!selecionados.estaVazia())
                    {
                        toolStripButton2.Enabled = true;
                    }
                    else
                    {
                        toolStripButton2.Enabled = false;
                    }
                }
                break;
            }
        }
Пример #3
0
        private void pbAreaDesenho_MouseMove(object sender, MouseEventArgs e)
        {
            statusPosicao.Text = "X: " + e.X + ", Y: " + e.Y;

            var posCursor = new Ponto(e.X, e.Y);

            var temp = (Bitmap)salvo.Clone();   //Cria um bitmap temporário para exibir formas ainda não definitivas

            if (!pontos.estaVazia() && selTool != "")
            {
                switch (selTool)
                {
                case "circulo":
                    var c = drawArea.Objetos.ultimo.info as Circulo;
                    c.SetRaio(Convert.ToInt32(new Ponto(c.Posicao.X, c.Posicao.Y).GetDistancia(posCursor)));
                    break;

                case "retangulo":
                    //var r = (drawArea.Objetos.ultimo.info as Retangulo);
                    var pInicial = new Ponto(Math.Min(posCursor.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Min(posCursor.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    var pFinal   = new Ponto(Math.Max(posCursor.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Max(posCursor.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    (drawArea.Objetos.ultimo.info as Retangulo).Posicao = pInicial.ToPoint();
                    (drawArea.Objetos.ultimo.info as Retangulo).Altura  = pFinal.Y - pInicial.Y;
                    (drawArea.Objetos.ultimo.info as Retangulo).Largura = pFinal.X - pInicial.X;
                    statusDesenho.Text = "Retangulo(";
                    foreach (Ponto p in (drawArea.Objetos.ultimo.info as Retangulo).Vertices)
                    {
                        statusDesenho.Text += "(" + p.X + "," + p.Y + ")";
                    }
                    statusDesenho.Text += "), Largura: " + (drawArea.Objetos.ultimo.info as Retangulo).Largura + ", Altura: " + (drawArea.Objetos.ultimo.info as Retangulo).Altura;
                    break;

                case "linha":
                    (drawArea.Objetos.ultimo.info as Linha).PontoFim = posCursor;
                    break;

                case "polilinha":
                    (drawArea.Objetos.ultimo.info as Polilinha).Vertices.ultimo.info = posCursor;
                    break;

                case "desenho livre":
                    (drawArea.Objetos.ultimo.info as Polilinha).Vertices.insereAposFim(new NoLista <Ponto>(posCursor, null));
                    break;

                case "elipse":
                    pInicial = new Ponto(Math.Min(posCursor.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Min(posCursor.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    pFinal   = new Ponto(Math.Max(posCursor.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Max(posCursor.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    (drawArea.Objetos.ultimo.info as Elipse).Posicao = pInicial.ToPoint();
                    (drawArea.Objetos.ultimo.info as Elipse).Altura  = pFinal.Y - pInicial.Y;
                    (drawArea.Objetos.ultimo.info as Elipse).Largura = pFinal.X - pInicial.X;
                    break;

                case "selecao":
                    selecionados = new ListaSimples <Figura>();
                    pInicial     = new Ponto(Math.Min(posCursor.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Min(posCursor.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    pFinal       = new Ponto(Math.Max(posCursor.Posicao.X, pontos.primeiro.info.Posicao.X), Math.Max(posCursor.Posicao.Y, pontos.primeiro.info.Posicao.Y));
                    var rect = new Retangulo(pInicial, Math.Abs(pFinal.X - pInicial.X), Math.Abs(pFinal.Y - pInicial.Y));
                    rect.CorContorno      = Color.Black;
                    rect.Preencher        = true;
                    rect.Espessura        = 3;
                    rect.CorPreenchimento = Color.FromArgb(60, 0, 0, 255);
                    rect.desenhar(Graphics.FromImage(temp));

                    if (pontos.QtosNos < 2)
                    {
                        pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                    }
                    pontos.primeiro.prox.info = posCursor;
                    //pontos.insereAposFim(new NoLista<Ponto>(pInicial, null));
                    //pontos.insereAposFim(new NoLista<Ponto>(pFinal, null));
                    break;

                case "deslocar":
                    //var deltaX = posCursor.X - pontos.primeiro.info.X;
                    //var deltaY = posCursor.Y - pontos.primeiro.info.Y;
                    //var atual = selecionados.primeiro;
                    break;
                }
            }

            if ((selTool == "selecao" || selTool == "deslocar" || selTool == "ajustar" || selTool == "rotacionar") && !selecionados.estaVazia())
            {
                var       forma = selecionados.primeiro;
                Retangulo rec;
                while (forma != null)
                {
                    switch (forma.info.GetType().ToString())    //Destaca 'pontos notáveis' nas figuras selecionadas
                    {
                    case "pEditorGrafico.Retangulo":
                        foreach (Ponto p in (forma.info as Retangulo).Vertices)
                        {
                            rec                  = new Retangulo(new Ponto(p.X - 2, p.Y - 2), 4, 4);
                            rec.Espessura        = 2;
                            rec.Preencher        = true;
                            rec.CorPreenchimento = Color.LightGray;
                            rec.desenhar(Graphics.FromImage(temp));
                        }
                        break;

                    case "pEditorGrafico.Circulo":
                        var pt = new Ponto(forma.info.Posicao.X - 2, forma.info.Posicao.Y - 2) + new Ponto((forma.info as Circulo).Raio, 0);
                        rec                  = new Retangulo(pt, 4, 4);
                        rec.Espessura        = 2;
                        rec.Preencher        = true;
                        rec.CorPreenchimento = Color.LightGray;
                        rec.desenhar(Graphics.FromImage(temp));
                        break;

                    case "pEditorGrafico.Linha":
                        foreach (Ponto p in (forma.info as Linha).Vertices)
                        {
                            rec                  = new Retangulo(new Ponto(p.X - 2, p.Y - 2), 4, 4);
                            rec.Espessura        = 2;
                            rec.Preencher        = true;
                            rec.CorPreenchimento = Color.LightGray;
                            rec.desenhar(Graphics.FromImage(temp));
                        }
                        break;

                    case "pEditorGrafico.Ponto":
                        pt                   = (forma.info as Ponto);
                        rec                  = new Retangulo(new Ponto(pt.X - 2, pt.Y - 2), 4, 4);
                        rec.Espessura        = 2;
                        rec.Preencher        = true;
                        rec.CorPreenchimento = Color.LightGray;
                        rec.desenhar(Graphics.FromImage(temp));
                        break;

                    case "pEditorGrafico.Polilinha":
                        var poli    = (forma.info as Polilinha);
                        var vertice = poli.Vertices.primeiro;
                        while (vertice != null)
                        {
                            rec                  = new Retangulo(new Ponto(vertice.info.X - 2, vertice.info.Y - 2), 4, 4);
                            rec.Espessura        = 2;
                            rec.Preencher        = true;
                            rec.CorPreenchimento = Color.LightGray;
                            rec.desenhar(Graphics.FromImage(temp));
                            vertice = vertice.prox;
                        }
                        break;

                    case "pEditorGrafico.Elipse":
                        Ponto[] ladosEl;
                        ladosEl = new Ponto[4];
                        var el = (forma.info as Elipse);
                        ladosEl[0] = new Ponto(el.Posicao.X + el.Largura / 2, el.Posicao.Y);
                        ladosEl[1] = new Ponto(el.Posicao.X + el.Largura, el.Posicao.Y + el.Altura / 2);
                        ladosEl[2] = new Ponto(el.Posicao.X + el.Largura / 2, el.Posicao.Y + el.Altura);
                        ladosEl[3] = new Ponto(el.Posicao.X, el.Posicao.Y + el.Altura / 2);
                        foreach (Ponto p in ladosEl)
                        {
                            rec                  = new Retangulo(new Ponto(p.X - 2, p.Y - 2), 4, 4);
                            rec.Espessura        = 2;
                            rec.Preencher        = true;
                            rec.CorPreenchimento = Color.LightGray;
                            rec.desenhar(Graphics.FromImage(temp));
                        }
                        break;
                    }
                    forma = forma.prox;
                }
            }
            NoLista <Figura> atual;

            /*if(!selecionados.estaVazia() && selTool=="deslocar")
             * {
             *  bool achou = false;
             *  //pbAreaDesenho.Cursor = Cursors.Default;
             *  atual = selecionados.primeiro;
             *  while(atual != null)
             *  {
             *      if(atual.info.Contem(posCursor))
             *      {
             *          achou = true;
             *          break;
             *      }
             *      atual = atual.prox;
             *  }
             *  if (achou && pbAreaDesenho.Cursor!=Cursors.Hand)
             *      pbAreaDesenho.Cursor = Cursors.Hand;
             *  else
             *      if(pbAreaDesenho.Cursor != Cursors.Default)
             *          pbAreaDesenho.Cursor = Cursors.Default;
             * }*/

            if (!drawArea.Objetos.estaVazia())
            {
                drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(temp));
            }

            atual = drawArea.Objetos.primeiro;
            while (atual != null)
            {
                switch (atual.info.GetType().ToString())
                {
                case "pEditorGrafico.Retangulo":
                    foreach (Ponto p in (atual.info as Retangulo).Vertices)
                    {
                        if (p.GetDistancia(posCursor) <= 4)
                        {
                            new Retangulo(new Ponto(p.X - 2, p.Y - 2), 4, 4).desenhar(Graphics.FromImage(temp));
                            break;
                        }
                    }
                    break;

                case "pEditorGrafico.Circulo":
                    var l = new Linha((atual.info as Circulo).GetCentro(), posCursor, Color.Black);
                    //statusDesenho.Text = "Inclinação: " + l.GetInclinacao();
                    var pCirculo = (atual.info as Circulo).GetPonto(l.GetInclinacao());
                    if (pCirculo.GetDistancia(posCursor) <= 6)
                    {
                        new Retangulo(new Ponto(pCirculo.X - 2, pCirculo.Y - 2), 4, 4).desenhar(Graphics.FromImage(temp));
                        break;
                    }
                    break;

                case "pEditorGrafico.Linha":
                    foreach (Ponto p in (atual.info as Linha).Vertices)
                    {
                        if (p.GetDistancia(posCursor) <= 4)
                        {
                            new Retangulo(new Ponto(p.X - 2, p.Y - 2), 4, 4).desenhar(Graphics.FromImage(temp));
                            break;
                        }
                    }
                    break;

                case "pEditorGrafico.Ponto":
                    var pt = (atual.info as Ponto);
                    if ((atual.info as Ponto).GetDistancia(posCursor) <= 4)
                    {
                        new Retangulo(new Ponto(pt.X - 2, pt.Y - 2), 4, 4).desenhar(Graphics.FromImage(temp));
                        break;
                    }
                    break;

                case "pEditorGrafico.Polilinha":
                    var poli    = (atual.info as Polilinha);
                    var vertice = poli.Vertices.primeiro;
                    while (vertice != null)
                    {
                        if (vertice.info.GetDistancia(posCursor) <= 4)
                        {
                            new Retangulo(new Ponto(vertice.info.X - 2, vertice.info.Y - 2), 4, 4).desenhar(Graphics.FromImage(temp));
                            break;
                        }
                        vertice = vertice.prox;
                    }
                    break;

                case "pEditorGrafico.Elipse":
                    Ponto[] ladosEl;
                    ladosEl = new Ponto[4];
                    var el = (atual.info as Elipse);
                    ladosEl[0] = new Ponto(el.Posicao.X + el.Largura / 2, el.Posicao.Y);
                    ladosEl[1] = new Ponto(el.Posicao.X + el.Largura, el.Posicao.Y + el.Altura / 2);
                    ladosEl[2] = new Ponto(el.Posicao.X + el.Largura / 2, el.Posicao.Y + el.Altura);
                    ladosEl[3] = new Ponto(el.Posicao.X, el.Posicao.Y + el.Altura / 2);
                    foreach (Ponto p in ladosEl)
                    {
                        if (p.GetDistancia(posCursor) <= 4)
                        {
                            new Retangulo(new Ponto(p.X - 2, p.Y - 2), 4, 4).desenhar(Graphics.FromImage(temp));
                            break;
                        }
                    }
                    break;
                }
                atual = atual.prox;
            }
            pbAreaDesenho.Image = temp;
        }
Пример #4
0
        private void pbAreaDesenho_MouseDown(object sender, MouseEventArgs e)
        {
            var posCursor = new Ponto(e.X, e.Y);

            switch (selTool)
            {
            case "circulo":
                if (pontos.estaVazia())
                {
                    drawArea.AdicionarObjeto(new Circulo(posCursor, posCursor, drawArea.CorAtual));
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;

            case "retangulo":
                if (pontos.estaVazia())
                {
                    var rect = new Retangulo(posCursor, 0, 0);
                    rect.CorContorno = drawArea.CorAtual;
                    drawArea.AdicionarObjeto(rect);
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;

            case "linha":
                if (pontos.estaVazia())
                {
                    drawArea.AdicionarObjeto(new Linha(posCursor, posCursor, drawArea.CorAtual));
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;

            case "polilinha":
                if (pontos.estaVazia())
                {
                    var pol = new Polilinha(posCursor, posCursor);
                    pol.CorContorno = drawArea.CorAtual;
                    drawArea.AdicionarObjeto(pol);
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                else
                {
                    if (e.Button == System.Windows.Forms.MouseButtons.Right)
                    {
                        pontos = new ListaSimples <Ponto>();
                        drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                        pbAreaDesenho.Image = salvo;
                    }
                    else
                    {
                        var pol = (Polilinha)drawArea.Objetos.ultimo.info;
                        pol.Vertices.insereAposFim(new NoLista <Ponto>(posCursor, null));
                        pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                    }
                }
                break;

            case "desenho livre":
                if (pontos.estaVazia())
                {
                    var pol = new Polilinha(posCursor, posCursor);
                    pol.CorContorno = drawArea.CorAtual;
                    drawArea.AdicionarObjeto(pol);
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;

            case "ponto":
                drawArea.AdicionarObjeto(new Ponto(posCursor.X, posCursor.Y, drawArea.CorAtual));
                drawArea.Objetos.ultimo.info.desenhar(Graphics.FromImage(salvo));
                pbAreaDesenho.Image = salvo;
                break;

            case "elipse":
                if (pontos.estaVazia())
                {
                    var el = new Elipse(posCursor, 0, 0);
                    el.CorContorno = drawArea.CorAtual;
                    drawArea.AdicionarObjeto(el);
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;

            case "selecao":
                if (pontos.estaVazia())
                {
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;

            case "deslocar":
                if (pontos.estaVazia())
                {
                    pontos.insereAposFim(new NoLista <Ponto>(posCursor, null));
                }
                break;
            }
        }