Creando controles de Instrumentacion para c# 2010

La verdad es que si. ¿Se puede hacer algo como medir el rendimiento de su propia aplicación? Como el que hace Windows.
 
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.
 

Adjuntos

  • sofwate2.jpg
    sofwate2.jpg
    48.4 KB · Visitas: 68
  • paraforo.zip
    267.6 KB · Visitas: 99
  • IME.jpg
    IME.jpg
    68.6 KB · Visitas: 81
  • CONTROL DE SERVOS.zip
    621.8 KB · Visitas: 117
Última edición:
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
 
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...
 
Última edición:
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!
 
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
 
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:D:oops:
 
Hola:

Ver el archivo adjunto 37010
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.

IC113419.gif


Saludos.

Edito:

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



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.
 
Última edición:
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.
 
Hola:

Pues tienes razón, ahora me funciona.

443709


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.
443710

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. ;)
 
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
 
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.

443728


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.

443730


Se que no se parece nada a una lavadora, :D:D:D:D:D:D. 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.

labadora.png

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.

443741


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();
        }
    }
}

443743


El próximo reto es hacer oleaje en el agua cuando el motor verde esté en marcha. Cuando se detenga, pues se queda quieta.
 
Última edición:
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.
Galilean_moon_Laplace_resonance_animation.gif


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


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.
 
Atrás
Arriba