Click here to Skip to main content
15,896,512 members
Articles / Multimedia / OpenGL

Universal Framework for Science and Engineering - Part 7: Virtual Reality at Once

Rate me:
Please Sign up or sign in to vote.
4.96/5 (105 votes)
19 Nov 2010CPOL25 min read 187.6K   14.4K   212  
An article on framework applications to virtual reality
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using DiagramUI;
using Diagram.UI.Interfaces;
using DiagramUI.Labels;
using DiagramUI.Utils;
using DiagramUI.Interfaces;

using BaseTypes;
using BaseTypes.Utils;


using FormulaEditor;

using ToolBox;

using DataPerformer;
using DataPerformer.Interfaces;


namespace DataPerformerUI.Forms
{
    /// <summary>
    /// Editor of properties of recursive element
    /// </summary>
    public partial class FormRecursive : Form, IUpdatableForm
    {
       // private Hashtable variableCombo = new Hashtable();
        private IObjectLabel label;
        private Recursive recursive;
        private Hashtable formulaHash = new Hashtable();
        private Hashtable aliasCombo = new Hashtable();
        private Hashtable formulaPanels = new Hashtable();
        const Double a = 0;



        private FormRecursive()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="label">Component label</param>
        public FormRecursive(IObjectLabel label)
            : this()
        {
            this.LoadResources();
            PanelFormula.SetResize(panelFormula);
            this.label = label;
            recursive = label.Object as Recursive;
            DiagramUI.AliasTable.SetAlias(propertyGridAl, recursive);
            ArrayList comments = recursive.Comments;
            userControlCommentsFont.Comments = comments;
            UpdateFormUI();
            fillVariables();
            fillFormulas();
            fillConstants();
            fillMeasurements();
            createAndFillAliasComboBox();
        }



        #region IUpdatableForm Members

        /// <summary>
        /// Updates form UI
        /// </summary>
        public void UpdateFormUI()
        {
            Text = label.Name;
        }

        #endregion


        private void fillVariables()
        {
            string var = Forms.FormDiffEquation.Variables;
            Hashtable variables = recursive.Variables;
            string vars = "";
            foreach (char c in variables.Keys)
            {
                vars += c;
            }
            for (int i = 0; i < var.Length; i++)
            {
                char v = var[i];
                if (vars.IndexOf(v) > -1)
                {
                    checkedListBoxV.Items.Add("" + v, CheckState.Checked);
                }
                else
                {
                    checkedListBoxV.Items.Add("" + v, CheckState.Unchecked);
                }
            }

        }

        private void fillFormulas()
        {
            Hashtable variables = recursive.Variables;
            formulaHash.Clear();
            formulaPanels.Clear();
            panelFormula.Controls.Clear();
            int top = 0;
            foreach (char c in variables.Keys)
            {
                PanelFormula p = new PanelFormula("" + c, this, panelFormula.Width, 200, Forms.FormDiffEquation.Variables, false, null, null);
                p.Left = 0;
                p.Top = top;
                top += p.Height;
                object[] o = variables[c] as object[];
                if (o[1] != null)
                {
                    string f = o[1] as string;
                    p.Formula = f;
                }
                panelFormula.Controls.Add(p);
                formulaHash[c] = p;
            }
        }

        private void fillConstants()
        {
            string st = recursive.AllExternalVariables;
            string str = recursive.AliasesString;
            Hashtable vars = recursive.Variables;
            checkedListBoxP.Items.Clear();
            foreach (char c in st)
            {
                if (vars.ContainsKey(c))
                {
                    continue;
                }
                if (str.IndexOf(c) < 0)
                {
                    checkedListBoxP.Items.Add(c + "", CheckState.Unchecked);
                }
                else
                {
                    checkedListBoxP.Items.Add(c + "", CheckState.Checked);
                }

            }
            dataTableInitial.Clear();
            Hashtable var = recursive.Variables;
            foreach (char c in var.Keys)
            {
                object[] o = var[c] as object[];
                double a = Converter.ToDouble(o[2]);
                dataTableInitial.Rows.Add(new object[] { c + "", a });
            }
            IAlias al = recursive;
            IList<string> list = al.AliasNames;
            dataTableP.Clear();
            foreach (string s in list)
            {
                if (var.ContainsKey(s[0]))
                {
                    continue;
                }
                dataTableP.Rows.Add(new object[] { s, Converter.ToDouble(al[s]) });
            }
        }


        private void fillMeasurements()
        {
            string s = "";
            Hashtable table = recursive.Arguments;
            foreach (char ch in table.Keys)
            {
                s += ch;
            }
            IDataConsumer c = recursive;
            int y = 0;
            for (int i = 0; i < c.Count; i++)
            {
                IMeasurements arrow = c[i];
                PanelMeasureFormula panel = new PanelMeasureFormula(arrow, s, recursive);
                panel.Width = 300;
                Panel pan = new Panel();
                pan.Width = panel.Width;
                pan.BackColor = Color.Black;
                pan.Top = y;
                pan.Height = 2;
                panelMea.Controls.Add(pan);
                y += pan.Height;
                panelMea.Controls.Add(panel);
                panel.Left = 0;
                panel.Top = y;
                y += panel.Height + 1;
            }
            comboBoxTime.FillCombo(s);
            foreach (char ch in table.Keys)
            {
                if (table[ch].Equals("Time"))
                {
                    int n = s.IndexOf(ch);
                    comboBoxTime.SelectedIndex = n;
                    break;
                }
            }

        }

        private void fillMeaCombo()
        {
            string s = "";
            Hashtable table = recursive.Arguments;
            foreach (char ch in table.Keys)
            {
                s += ch;
            }
            foreach (Control c in panelMea.Controls)
            {
                if (!(c is PanelMeasureFormula))
                {
                    continue;
                }
                PanelMeasureFormula p = c as PanelMeasureFormula;
                p.FillComboboxes(s);
            }
            comboBoxTime.FillCombo(s);
        }

        private void createAndFillAliasComboBox()
        {
            IMeasurements m = recursive;
            Panel panelComboAliasInner = new Panel();
            panelComboAliasInner.Width = panelComboAlias.Width;
            panelComboAliasInner.Height = 5;
            panelComboAlias.Controls.Add(panelComboAliasInner);
            int y = 0;
            List<string> al = new List<string>();
            recursive.GetAliases(al, null);
            Hashtable ea = recursive.ExternalAliases;
            for (int i = 0; i < m.Count; i++)
            {
                IMeasure mea = m[i];
                char c = mea.Name[0];
                ComboBox cb = new ComboBox();
                panelComboAliasInner.Controls.Add(cb);
                aliasCombo[c] = cb;
                cb.Width = 121;
                cb.Height = 21;
                cb.Top = 10 + y;
                cb.Left = 10;
                Label l = new Label();
                panelComboAliasInner.Controls.Add(l);
                l.Text = c + "";
                l.Top = cb.Top;
                l.Left = cb.Left + cb.Width + 10;
                foreach (string s in al)
                {
                    cb.Items.Add(s);
                }
                y += cb.Height + 10;
                if (ea == null)
                {
                    continue;
                }
                if (ea.ContainsKey(c))
                {
                    string str = ea[c] as string;
                    for (int j = 0; j < cb.Items.Count; j++)
                    {
                        if (str.Equals(cb.Items[j].ToString()))
                        {
                            cb.SelectedIndex = j;
                            break;
                        }
                    }
                }
            }
            panelComboAliasInner.Height = y;

        }

        private ArrayList arguments
        {
            get
            {
                ArrayList list = new ArrayList();
                foreach (Control c in panelMea.Controls)
                {
                    if (!(c is PanelMeasureFormula))
                    {
                        continue;
                    }
                    PanelMeasureFormula p = c as PanelMeasureFormula;
                    p.AddArgumentLabels(list);
                }
                object o = comboBoxTime.SelectedItem;
                if (o != null)
                {
                    list.Add(o + " = Time");
                }
                return list;
            }
        }

 
 


        private void buttonVar_Click(object sender, EventArgs e)
        {
            try
            {
                Hashtable table = new Hashtable();

                foreach (string s in checkedListBoxV.CheckedItems)
                {
                    object[] o = new object[3];
                    double a = 0;
                    o[0] = a;
                    o[2] = a;
                    table[s[0]] = o;
                }
                recursive.Variables = table;
                fillFormulas();
            }
            catch (Exception ex)
            {
                ex.Log();
                this.ShowError(ex);
            }
        }

        private void buttonAcceptForm_Click(object sender, EventArgs e)
        {
            try
            {
                Hashtable table = new Hashtable();
                foreach (char c in formulaHash.Keys)
                {
                    PanelFormula p = formulaHash[c] as PanelFormula;
                    table[c] = p.Formula;
                }
                recursive.Formulas = table;
                fillConstants();
            }
            catch (Exception ex)
            {
                ex.Log();
                this.ShowError(ex);
            }
        }

        private void buttonAcceptConst_Click(object sender, EventArgs e)
        {
            try
            {
                string s = "";
                foreach (string str in checkedListBoxP.CheckedItems)
                {
                    s += str[0];
                }
                recursive.AliasesString = s;
                DiagramUI.AliasTable.SetAlias(propertyGridAl, recursive);
                fillMeaCombo();
            }
            catch (Exception ex)
            {
                ex.Log();
                this.ShowError(ex);
            }
        }

        private void buttonAcceptPar_Click(object sender, EventArgs e)
        {
            try
            {
                ArrayList arg = arguments;
                Hashtable table = new Hashtable();
                foreach (string s in arg)
                {
                    table[s[0]] = s.Substring(4);
                }
                recursive.Arguments = table;
                fillConstants();
                createAndFillAliasComboBox();
            }
            catch (Exception ex)
            {
                ex.Log();
                this.ShowError(ex);
            }
        }

        private void buttonAcceptInitial_Click(object sender, EventArgs e)
        {
            IAlias al = recursive;
            try
            {
                foreach (DataRow row in dataTableP.Rows)
                {
                    string s = row[0] as string;
                    double a = (double)row[1];

                    al[s] = a;
                }
                Hashtable var = recursive.Variables;
                foreach (DataRow row in dataTableInitial.Rows)
                {
                    string st = row[0] as string;
                    double at = (double)row[1];
                    object[] o = var[st[0]] as object[];
                    o[0] = o[2].Convert(at);
                }
            }
            catch (Exception ex)
            {
                ex.Log();
                this.ShowError(ex);
            }
        }

        private void buttonAcceptAliases_Click(object sender, EventArgs e)
        {
            try
            {
                Hashtable table = new Hashtable();
                foreach (char c in aliasCombo.Keys)
                {
                    ComboBox cb = aliasCombo[c] as ComboBox;
                    if (cb.SelectedIndex < 0)
                    {
                        continue;
                    }
                    table[c] = cb.SelectedItem.ToString();
                }
                recursive.ExternalAliases = table;
            }
            catch (Exception ex)
            {
                ex.Log();
                this.ShowError(ex);
            }
        }
        private void FormRecursive_FormClosing(object sender, FormClosingEventArgs e)
        {
            userControlCommentsFont.Save();
        }

        private void userControlCommentsFont_AcceptComments(ICollection comments)
        {
            recursive.Comments = userControlCommentsFont.Comments as ArrayList;
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
Russian Federation Russian Federation
Ph. D. Petr Ivankov worked as scientific researcher at Russian Mission Control Centre since 1978 up to 2000. Now he is engaged by Aviation training simulators http://dinamika-avia.com/ . His additional interests are:

1) Noncommutative geometry

http://front.math.ucdavis.edu/author/P.Ivankov

2) Literary work (Russian only)

http://zhurnal.lib.ru/editors/3/3d_m/

3) Scientific articles
http://arxiv.org/find/all/1/au:+Ivankov_Petr/0/1/0/all/0/1

Comments and Discussions