Acciona Energía – Microsoft Case Study

Basándose en la tecnología .NET de Microsoft se ha desarrollado un sistema SCADA que de manera centralizada muestra toda la información de manera gráfica y muy intuitiva. De esta manera es posible controlar en todo momento la situación de toda la planta, teniendo bajo control 42.000 variables y 48.000 alarmas «Al tener dentro del mismo entorno acceso a la información histórica es posible hacer de manera sencilla un estudio estadístico de las alarmas, llegando a un análisis predictivo de las mismas. De la misma manera se pueden realizar análisis de correlaciones entre distintas variables, como por ejemplo Potencia con Irradiancia», detalla Javier Arratíbel. 

 

En el desarrollo ha participado Plain Concepts como apoyo al personal interno de Desarrollo, colaborando decisivamente en la definición de la arquitectura de la solución, formación, diseño gráfico y mentoring en los primeros pasos del desarrollo. «Su ayuda ha sido esencial ya que hemos establecido juntos una base sólida sobre la que poder escalar el sistema de manera controlada», declara el directivo de ACCIONA Energía, quien añade que «En estos momentos, con nuestros desarrolladores internos somos capaces de asumir futuras funcionalidades aunque seguimos contando con Plain Concepts para acelerar el desarrollo, para formación y mentoring».

 

Puedes consultarlo completo en: 

 

http://www.microsoft.com/spain/enterprise/enterprise09/detalle-casos-de-exito.aspx?ContenidoID=20100510001

 

How-To: Extender un control de Silverlight

Una de las ventajas que nos proporcionan los tipos de WPF y Silverlight es la de extender mediante herencia la funcionalidad de una determinada clase del Framework.

Esto quiere decir que podemos partir de un control que ya disponga de la funcionalidad base que necesitamos y extenderla mediante código personalizado para agregarle una determinada funcionalidad que mejore o aumente dicha funcionalidad.

Un ejemplo de los tipos que podemos extender son todos aquellos que herenden de la clase Panel, como por ejemplo un Grid.

En el ejemplo que muestro a continuación veremos como añadirle a un  Grid el comportamiento de pivotar en relación a la posición actual del ratón haciendo uso de la transfomación de proyección de plano de Silverlight 3.0.

Este tipo de proyección en combinación con las animaciones que nos proporciona Silverlight consiguen un efecto de desplazamiento suave en respuesta a la interacción del usuario.

 

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace PlaneProyect
{
    /// <summary>
    /// Overriden Grid type for integrated Mouse Plane Proyection
    /// </summary>
    public class FloatingGrid: Grid
    {

        #region Private Fields

        /// <summary>
        /// Store the Grid's Plane Proyection 
        /// </summary>
        private PlaneProjection _planeP;

        #endregion

        #region Constructors

        /// <summary>
        /// Default Constructor with events subscriptions
        /// </summary>
        public FloatingGrid()
        {
            MouseMove += (FloatingGrid_MouseMove);
            MouseEnter += (FloatingGrid_MouseEnter);
            MouseLeave += (FloatingGrid_MouseLeave);
            Loaded += (FloatingGrid_Loaded);
        }

        #endregion

        #region Properties

        [Category("Common Properties")]
        public double MaximunAngle
        {
            get { return (double)GetValue(MaximunAngleProperty); }
            set { SetValue(MaximunAngleProperty, value); }
        }

        public static readonly DependencyProperty MaximunAngleProperty =
            DependencyProperty.Register("MaximunAngle", typeof(double), typeof(FloatingGrid), new PropertyMetadata(10.0));

        #endregion

        #region Methods

        /// <summary>
        /// Animate Plane Proyection to a determinate position
        /// </summary>
        /// <param name="x">X Angle to move</param>
        /// <param name="y">Y angle to move</param>
        private void AnimateTo(double x, double y)
        {
            var duration = new Duration(TimeSpan.FromSeconds(0.44));

            var xAnimation = new DoubleAnimation();
            var yAnimation = new DoubleAnimation();

            xAnimation.Duration = duration;
            yAnimation.Duration = duration;

            xAnimation.EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut};
            yAnimation.EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut };

            var sb = new Storyboard {Duration = duration};

            sb.Children.Add(xAnimation);
            sb.Children.Add(yAnimation);

            Storyboard.SetTarget(xAnimation, _planeP);
            Storyboard.SetTarget(yAnimation, _planeP);

            var xPath = new PropertyPath(PlaneProjection.RotationXProperty);
            var yPath = new PropertyPath(PlaneProjection.RotationYProperty);

            Storyboard.SetTargetProperty(xAnimation, xPath);
            Storyboard.SetTargetProperty(yAnimation, yPath);

            xAnimation.To = x;
            yAnimation.To = y;

            sb.Begin();

        }

        /// <summary>
        /// Determine the current angle to animate
        /// </summary>
        /// <param name="e">Gets the current mouse position</param>
        /// <returns>The X and Y Angles</returns>
        private Point GetCurrentAngles(MouseEventArgs e)
        {
            if (double.IsNaN(ActualWidth) || ActualWidth == 0) return new Point(0,0);
            var actualPos = e.GetPosition(this);
            var centerPoint = new Point(ActualWidth / 2, ActualHeight / 2);
            if (MaximunAngle <= 0) MaximunAngle = 10;
            var y = (actualPos.X - centerPoint.X) / centerPoint.X * MaximunAngle;
            var x = (actualPos.Y - centerPoint.Y) / centerPoint.Y * MaximunAngle;
            return new Point(x,y);
        }

        #endregion

        #region Event Handlers

        void FloatingGrid_Loaded(object sender, RoutedEventArgs e)
        {
            UpdateLayout();
            _planeP = new PlaneProjection();
            Projection = _planeP;
        }

        void FloatingGrid_MouseLeave(object sender, MouseEventArgs e)
        {
            AnimateTo(0,0);
        }

        void FloatingGrid_MouseEnter(object sender, MouseEventArgs e)
        {
            var pos = GetCurrentAngles(e);
            AnimateTo(pos.X, pos.Y);
        }

        void FloatingGrid_MouseMove(object sender, MouseEventArgs e)
        {
            var pos = GetCurrentAngles(e);
            AnimateTo(pos.X, pos.Y);
        }

        #endregion
       
    }
}

 

El resultado visual de este control al desplazar el ratón sobre él es similar al mostrado a continuación:

image

 

Un saludo,

Charlas para el Mix’10

Desde Plain Concepts se han realizado 5 propuestas de charlas para el Mix’10 que creemos pueden resultar de gran interés como novedades del desarrollo de RIA y Web a nivel español.

Como apoyo a nuestros compañeros os dejo los enlaces a las propuestas que hemos realizado:

BECOMING SOCIAL. How to power up your website using social networks

PLAIN CONCEPTS’ SILVERLIGHT LIVE MESSENGER TOOLKIT

SILVERLIGHT IN THE AUDIOVISUAL WORLD

EXTENDING THE WINDOWS LIVE MESSENGER WEB TOOLKIT WITH SCRIPT# AND SILVERLIGHT

WHAT YOU SEE IS NOT WHAT IS THERE. Users mind as a resource in Expression Blend

Si creeis que estas pueden resultar de interés agradeceremos vuestro apoyo para que salgan adelante votando en los enlaces anteriores.

Es muy simple:

 Solo tenéis que pinchar sobre «Add to ballot». Una vez hecho esto sobre todas, pinchad en «Submit Your Ballot» y ya está 😉

Saludos y gracias

WPF: How To: Mejorar el rendimiento en animaciones

Uno de los aspectos menos conocidos de las animaciones en Windows Presentation Foundation es la capacidad de control que tenemos sobre su comportamiento en tiempo de dibujado.

WPF nos provee entre otras muchas cosas de la capacidad de modificar el Frame Rate (nº de fotogramas por segundo) utilizados para animar un elemento por el motor de composición de WPF.

Para controlar este aspecto de las animaciones solo debemos hacer lo siguiente:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Timeline.DesiredFrameRateProperty.OverrideMetadata(
                   typeof(Timeline),
                       new FrameworkPropertyMetadata { DefaultValue = 10 });
        }
    }

Esto modifica dicha propiedad de dependencia «DesiredFrameRateProperty» para todas las animaciones ccontenidas dentro de esta ventana.

Un dato interesante también es que el valor por defecto de esta propiedad es de 50 fotogramas por segundo.

Advertir que al modificar dicho valor incrementamos o reducimos el consumo de CPU para la gestión de las animaciones, por lo que debe ser usada con mucha precaución ya que su uso incorrecto puede derivar en un consumo elevado o en efectos gráficos no deseados.

Espero que os resulte de utilidad.

Saludos

SURFACE: Hoy se hace publico el SP1 de Surface

Según se anuncia en el blog oficial de Microsoft Surface hoyse publica el Service Pack 1 de Microsoft Surface con una gran serie de mejoras:

Application Development

  • API enhancements, WFP library and menu controls
  • Stress testing tool
  • 128-big identity tag resources

New platform capabilities

  • Enabling users to quickly switch between applications using tagged object routing
  • Background service application support 

Improved User Interface

  • Improved «Access Points»
  • Single application mode
  • Touch/contact feedback and visualization

Plus..

  • Localized end-user and administrative interface in available counties
  • New calibration guides removing need for external display during configuration
  • Microsoft Update integration
  • Microsoft Management Pack support

Podemos ver un avace en los siguientes enlaces:

Anuncio del lanzamiento

Video con demo del SP1