Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

19/12/2010 #81

Avatar de ByAxel

Está bueno...
19/12/2010 #82

Avatar de Meta

La verdad es que si. ¿Se puede hacer algo como medir el rendimiento de su propia aplicación? Como el que hace Windows.
20/12/2010 #83

Avatar de george.manson.69

Practicas simples con el control de Termometro y el graficador
He realizado dos practicas donde utiliza el graficador y el termometro de los controles anteriores de post...
Recuerda simepre utilizar el MAX232 para comunicaciones seriales entre PC a PIC.

'''''''''''''''''''''''''''''''''''''
CONTROL DE SERVOS

Aunque no tenga nada que ver el software con el tema...lo subo esta practica ya que es un software practico y funcional que lo probe en mi escuela es para controlar 8 servomotores.
el programa que contiene el Micro esta realizado en HI TECH compiler para pic16 en modo lite.
Imágenes Adjuntas
Tipo de Archivo: jpg sofwate2.jpg (48,4 KB (Kilobytes), 64 visitas)
Tipo de Archivo: jpg IME.jpg (68,6 KB (Kilobytes), 77 visitas)
Archivos Adjuntos
Tipo de Archivo: zip paraforo.zip (267,6 KB (Kilobytes), 91 visitas)
Tipo de Archivo: zip CONTROL DE SERVOS.zip (621,8 KB (Kilobytes), 106 visitas)
05/01/2011 #84

Avatar de Alerce

Esto de los Controles esta muy interesante,pero me gustaria saber si pudieran dar alguna explicacion de como se desarrollan los codigos fuentes, por ejemplo me gusto mucho el del
Test PanelLed V2,podrian hacer una guia para los que nos iniciamos.

gracias
05/01/2011 #85

Avatar de Meta

La verdad que son impresionantes.
01/04/2011 #86


george.manson.69 dijo: Ver Mensaje
Bueno subo un control muy sencillo un Medidor Circular.

Saludos.
Hola george.manson.69 está buenísimo recién lo probé.
Estoy trabajando en un proyecto para la facu, un dinamómetro inercial, es para medir la potencia de los motores de ciclomotores. La idea es mostrar las rpm con un tacómetro como este instrumento que hiciste y al costado ir mostrando en tiempo real la curva de potencia.
Estoy viendo como sería eso de ir graficando sobre un bitmap la curva de rpm y la curva de potencia, la idea es que pueda insertar valores de potencia (y) vs valor de rpm (x) a medida que me llegan los datos del pic desde el puerto serie.
Cualquier ayuda será bienvenida.

Saludos.

Cómo puedo hacer para graficar una curva en un PictureBox y después poder guardar la imagen? Sin usar ningún componente extra como zedgraph...
04/04/2011 #87


Update: Probé con el componente COM NTGraph, funciona bien, bastante fluido, con autoescala y todo.
El problema que tengo es que grafico dos curvas, es decir, dos elementos, entonces, como la amplitud máxima de una de las curvas es totalmente distinta a la otra la grafica no queda bien.
Alguien usó NTGraph y sabe como agregar ejes Y independientes en el mismo gráfico? Como para que el AutoRange se realice bien para las dos curvas. Saludos!
23/04/2011 #88

Avatar de Meta

Los componentes que están haciendo, incluso los pedazos de manuales incluidos están del diez.
23/04/2012 #89


bueno, quiero decirles que me gusta lo que hacen, yo solo pude graficar lineas que se mueven pero leyendo la entrada analogica del pic, y con un pot irlo variando, y asi tener una linea "animada", por asi decirlo, y me agradan sus ejemplos, porque quiero modificar controles asi como el temometro, grax
23/07/2012 #90


hola george.manson tengo unas preguntas acerca de tu control osciloscopio, como fue que logra ste redibujar sin borrar toda la pantalla o acaso no la borras.

para que tu dibujo se vea como el pasado es cambiado por el presente. y por ulktimo como puedo agregar tu archivo .dll para poder usar tu control, o no se si me podrias facilitar tu codigo mas o menos completp o decirme como ver tu .dll, yo estoy haciendo algo parecido como tu control, igual grafico, pero al final de mi picturebox limpio y empiezo a dibujar de nuevo, bueno, gracias por leer este mensaje y ojala pudieras darme una contestacion. gracias
13/04/2014 #91

Avatar de Meta

Hola:


Viendo esta imagen. Estoy intentando ahcer un círculo, no un eclipse, dentro de ella unpunto, luego una aguja que se mueve gracias al timer por cada segundo de 0 º a 306 º como un reloj.

Si alguien tiene un ejemplo de ello, pueden poner el código aquí. De momento hago rectas y flechas, pero no me sale en movimiento.



Saludos.

Edito:

He creado algo desde cero, todo a código.



Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Probando
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Graphics papel = pictureBox1.CreateGraphics();

            // Creamos el lápiz inicial.

            // Dibujamos una línea recta.
            Pen lápiz2 = new Pen(Color.Green, 10);
            lápiz2.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
            lápiz2.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor;
            papel.DrawLine(lápiz2, 20, 188, 188, 188);

            // Dibujar rectángulo.
            Pen lápiz3 = new Pen(Color.Black);
            papel.DrawRectangle(lápiz3, 10, 10, 376, 376);

            // Dibujar círculo 100 % redondo.
            Pen lápiz4 = new Pen(Color.Red, 5);
            papel.DrawEllipse(lápiz4, 10, 10, 376, 376);
        }
    }
}
Ahora no se como controlar la aguja o flecha verde con el trackbar1.

Saludo.
13/04/2014 #92

Avatar de ByAxel

Hola.
Utiliza el evento Paint del PictureBox, ahí dibujas...

Utiliza el evento del TrackbarChanged creo..., así como para un button por defecto es el evento Click... el TrackBar tiene un evento por derfecto, solo daz doble clic sobre el mismo y aparece en la ventana de código...

En el evento del trackBar coloca:
pictureBox1.Refresh(); también se puede usar .Invalidate();

Esto produce que se vuelva a dibujar el control pictureBox y entre a su evento Paint...

Saludos.
13/04/2014 #93

Avatar de Meta

Hola:

Pues tienes razón, ahora me funciona.



Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Drawing.Drawing2D; // No olvidar.

namespace Lavadora
{
    public partial class Form1 : Form
    {
        // Definir un objeto para crear líneas y curvas.
        private Pen lápiz2;
        private Pen lápiz3;
        private Pen lápiz4;
        private float ángulo;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Size = new Size(300, 300);
            pictureBox1.BackColor = Color.AntiqueWhite;

            lápiz2 = new Pen(Color.Green, 10);
            lápiz2.StartCap = LineCap.ArrowAnchor;
            lápiz2.EndCap = LineCap.RoundAnchor;

            lápiz3 = new Pen(Color.Black);
            lápiz4 = new Pen(Color.Red, 5);

            ángulo = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ángulo += 10F;
            pictureBox1.Refresh();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ángulo -= 10F;
            pictureBox1.Refresh();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);

            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.RotateTransform(ángulo);
            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
            e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            ángulo = (float)trackBar1.Value;
            pictureBox1.Refresh();
            label_angulo.Text = ángulo.ToString();
        }
    }
}
No olvidar las propiedades esto.
trackBar1.Maximum = 180;
trackBar1.Minimum = -180;
trackBar1.LargeChange = 1;

Ahora toca otro reto más complejo.

En el dibujo de arriba hecho con paint de Windows 7, todo lo dibujado gris, si te fijas bien, gris fuerte es el círculo, gris flojo son rallas, haré el código fíjo primero que requiere tiempo. La cuestión es, que gire como la flecha verde. Como tiene muchas líneas de dibujo.



¿Cómo girar todo sincronizado al mismo tiempo?


Ya no es tan fácil.
13/04/2014 #94

Avatar de ByAxel

Hola...
No imaginé que usarias matriz de transformación para hacer girar el dibujo jeje... se puede pero me parece engorroso si que quiere hacer más cosas... Reiniciaciado la matriz y otros...

En las primeras páginas de este tema puse el código un control con manecilla... puede que te ayude, claro está algo más elavorado pero sirve.

Aquí un resumen de tal control, dibuja sobre un panel o control de usuario... al fin y al cavo casi en cualquier control se puede dibujar... incluso si se crea un control de usuario eredado se puede acceder a los eventos Paint y paintBackGround del mismo, ya sea pictureBox, Panel, Button, etc...

Código:
public partial class Form1 : Form
    {
        int x, y, width, height;
        private float minValue = 0;
        private float maxValue = 50;
        private float currentValue;
        private float recommendedValue;
        
        float fromAngle = 90F;  // 135
        float toAngle = 450F;   // 405

        public Form1()
        {
            InitializeComponent();

            panel1.Paint += panel1_Paint;

            x = 5;
            y = 5;
            minValue = 0;
            maxValue = 100;
            width = panel1.Width - 10;
            height = panel1.Height - 10;
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            width = panel1.Width - x * 2;
            height = panel1.Height - y * 2;
            DrawPointer(e.Graphics, ((width) / 2) + x, ((height) / 2) + y);
        }

        private void DrawPointer(Graphics gr, int cx, int cy)
        {
            float radius = panel1.Width / 2 - (panel1.Width * .12F);
            float val = maxValue - minValue;

            gr.SmoothingMode = SmoothingMode.AntiAlias;

            val = (100 * (currentValue - minValue)) / val;
            val = ((toAngle - fromAngle) * val) / 100;
            val += fromAngle;

            float angle = GetRadian(val);
            float gradientAngle = angle;

            gr.DrawLine(new Pen(Color.Black, 2), 
                new PointF(cx, cy), 
                new PointF((float)(cx + radius * Math.Cos(angle)), (float)(cy + radius * Math.Sin(angle))));
        }

        public float GetRadian(float theta)
        {
            return theta * (float)Math.PI / 180F;
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            currentValue = (float)trackBar1.Value;
            panel1.Refresh();
        }
    }
El trackBar... mínimo es 0 y máximo 100.

Saludos
13/04/2014 #95

Avatar de Meta

Holaaaaaa:

Me funciona demaravilla el como lo hiciste.

Tengo uno aquí hecho. Con colores cantosos para que se entienda, ya lo adaptaré cuando acabe todo.



Código bajo Visual C# Express 2013.

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Drawing.Drawing2D; // No olvidar.

namespace Lavadora_2
{
    public partial class Form1 : Form
    {
        private Pen lápiz2;
        private Pen lápiz3;
        private Pen lápiz4;
        private float ángulo;

        private GraphicsPath m_lavadora;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Size = new Size(300, 300);
            pictureBox1.BackColor = Color.AntiqueWhite;

            lápiz2 = new Pen(Color.Green, 10);
            lápiz2.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
            lápiz2.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor;

            lápiz3 = new Pen(Color.Black);
            lápiz4 = new Pen(Color.Red, 10);

            ángulo = 0;
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);

            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.RotateTransform(ángulo);
            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.DrawPath(lápiz2, m_lavadora);
        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            ángulo = (float)trackBar1.Value;
            pictureBox1.Refresh();
        }

        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            int ancho = pictureBox1.ClientSize.Width;
            int alto = pictureBox1.ClientSize.Height;

            m_lavadora = new GraphicsPath();

            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
            m_lavadora.CloseFigure();
        }
    }
}
Hay algo que no me sale, añadí otro trackBar, para llenar hasta arriba o vaciar el agua por completo.



Se que no se parece nada a una lavadora, . Cuando acabe de hacer lo que quiero hacer, empezaré a diseñarlo a base de códigos una lavadora que se parezca algo a lo indicado abajo.


Una curiosidad. ¿Se puede hacer el agua azul transparente con GDI+?

Cuando me salga todo lo que quiero, haré una simulación real del comportamiento de una lavadora. jejejeje.

Saludo.

Edito:
Pues si, si tiene transparencia y es de agradecer. Sabía que tiene muchos efectos, pero no sabía si tenía transparencia.



Código:
// Foros de electrónica http://www.forosdeelectronica.com
// By Meta.
// Fecha 14-04-2014.
// http://electronica-pic.blogspot.com.es

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Drawing.Drawing2D; // No olvidar.

namespace Lavadora_4
{
    public partial class Form1 : Form
    {
        private Pen lápiz2;
        private Pen lápiz3;
        private Pen lápiz4;
        private float ángulo;
        private SolidBrush agua;

        private GraphicsPath m_lavadora;
        private GraphicsPath m_agua;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Size = new Size(300, 300);
            pictureBox1.BackColor = Color.AntiqueWhite;

            lápiz2 = new Pen(Color.Green, 10);
            lápiz2.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
            lápiz2.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor;

            lápiz3 = new Pen(Color.Black);
            lápiz4 = new Pen(Color.Red, 10);

            ángulo = 0;

            agua = new SolidBrush(Color.FromArgb(200, 0, 0, 255)); // Transparencia del agua 200.
            trackBar2.Value = -90; // Para que empiece sin agua.
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);

            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.RotateTransform(ángulo);
            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.DrawPath(lápiz2, m_lavadora);
            e.Graphics.ResetTransform();
            e.Graphics.FillPath(agua, m_agua); 
        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            ángulo = (float)trackBar1.Value;
            pictureBox1.Refresh();
        }

        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            int ancho = pictureBox1.ClientSize.Width;
            int alto = pictureBox1.ClientSize.Height;

            m_lavadora = new GraphicsPath();

            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
            m_lavadora.CloseFigure();

            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, ancho - 40, alto - 40, trackBar2.Value, 180 - 2 * trackBar2.Value);
            m_agua.CloseFigure();
        }

        private void trackBar2_ValueChanged(object sender, EventArgs e)
        {
            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, pictureBox1.ClientSize.Width - 40, pictureBox1.ClientSize.Height - 40, -trackBar2.Value, 180 - 2 * -trackBar2.Value);
            m_agua.CloseFigure();
            pictureBox1.Refresh();
        }
    }
}


El próximo reto es hacer oleaje en el agua cuando el motor verde esté en marcha. Cuando se detenga, pues se queda quieta.
06/06/2015 #96

Avatar de Meta

Buenas:

Empezamos hacer gráficos desde Visul C# 2010, dentro de poco nos tocarñá con l aversión 2015 y en este momento lo haré con la versión 2013 que uso ahora mismo.

Estoy por hacer esto.


Solo he hecho esto como base sin código de funciones algunas.


Código base que he echo ahora solo esto.
Código:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;  namespace Dibujo_Animado_GDI {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }          private void button_Activar_Click(object sender, EventArgs e)         {             timer1.Start(); // Activa el temporizador. Lo que no se si esto es mejor así o como indica abajo.             // timer1.Enabled = true;             timer2.Start();             timer3.Start();              // Tiempos en cada timer, lo que no me sale como cambiarlo desde el textBox. 1000 milisegundo son 1 segundo.             timer1.Interval = 100; // 0.1 segundos.             timer1.Interval = 500; // 0.5 segundos o medio segundo.             timer1.Interval = 1000; // 1 segundo.         }          private void button_Detener_Click(object sender, EventArgs e)         {             // Detener los timer.             timer1.Stop(); // También puede ser así: timer1.Enabled = false, lo que no se cual es el más adecuado para estos casos.             timer2.Stop();             timer3.Stop();         }     } }
Estoy recordando como se crea al menos un círculo guiado por aquí.

Descargar proyecto boceto C# 2013.

Saludos.

PD: Lo que quieran ayudar para aumentar de megas en DropBox aquí les dejo una invitación. Invitar.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.