//this should be incremented at the time of successful acquistion and not if unsuccessful or cancelled
 private void AcquisitionLoop(object sa, PointAcqusitionFinishedEventArgs e)
 {
     #if TRACE
     if (e != null)
         Console.WriteLine("AcquisitionLoop " + electrodeNumber.ToString("0") + " " +
             (e.result == null) + " " + (e.Retry).ToString());
     else
         Console.WriteLine("AcquisitionLoop " + electrodeNumber.ToString("0"));
     #endif
     if (!executeSkip)
     {
         SystemSounds.Beep.Play();
         if (electrodeNumber >= 0)
         {
             if (!e.Retry)
             {
                 Triple t = DoCoordinateTransform(e.result);
                 string name = templateList[electrodeNumber].Name;
                 output1.Text = name + ": " + t.ToString();
                 XYZRecord xyz = new XYZRecord(name, t.v1, t.v2, t.v3);
                 if (electrodeLocations.Where(l => l.Name == name).Count() == 0) //assure unique electrode name
                 {
                     electrodeLocations.Add(xyz);
                     addPointToView(xyz);
                     Delete.IsEnabled = true;
                 }
                 else //this is a replacement
                 {
                     XYZRecord oldXYZ = electrodeLocations.Where(l => l.Name == name).First(); //get item to be replaced
                     int n = electrodeLocations.IndexOf(oldXYZ); //and replace old
                     electrodeLocations.Remove(oldXYZ); //remove
                     electrodeLocations.Insert(n, xyz); //replace with new
                     updateView(); //and redraw
                 }
                 electrodeNumber++; //on to next electrode location
             }
         }
         else if (electrodeNumber == -3) //first entry
         {
             if (e != null && !e.Retry)
             {
                 PN = e.result; //save Nasion
                 electrodeNumber++;
                 Redo.IsEnabled = true;
             }
             DoPrompting((e != null) && e.Retry);
             ((StylusAcquisition)sa).Start();
             return;
         }
         else if (electrodeNumber == -2)
         {
             //save previous result
             if (!e.Retry) //save Right preauricular
             {
                 PR = e.result;
                 electrodeNumber++;
             }
         }
         else //electrodeNumber == -1
         {
             //save previous result
             if (!e.Retry) //save Left preauricular
             {
                 PL = e.result;
                 CreateCoordinateTransform(); //calculate coordinate transformtion
                 electrodeNumber++;
                 drawAxes();
             }
         }
     }
     else //executing skip
     {
         electrodeNumber++;
         executeSkip = false;
     }
     if (electrodeNumber >= numberOfElectrodes)
     {
         if (voice)
         {
             int n = electrodeLocations.Count;
             prompt.ClearContent();
             prompt.StartSentence();
             prompt.AppendText("Completed acquisition of " + n.ToString("0") + " electrodes.");
             prompt.EndSentence();
             speak.Speak(prompt);
         }
         ElectrodeName.Text = "";
         writeElectrodeFile();
         return; //done
     }
     DoPrompting(e.Retry);
     ((StylusAcquisition)sa).Start();
     return;
 }
 /// <summary>
 /// Constructor for stream to read Electrode Position file, based on another stream;
 /// reads in entire file, creating dictionary of eletrode positions by name and then
 /// closing the stream
 /// </summary>
 /// <param name="str">Stream on which this stream is based</param>
 public ElectrodeInputFileStream(Stream str)
 {
     if (str == null || !str.CanRead) return; //return empty Dictionary
     XmlReaderSettings settings = new XmlReaderSettings();
     settings.IgnoreWhitespace = true;
     settings.IgnoreComments = true;
     settings.IgnoreProcessingInstructions = true;
     XmlReader xr;
     string nameSpace;
     string type;
     try
     {
         xr = XmlReader.Create(str, settings);
         if (xr.MoveToContent() != XmlNodeType.Element) throw new XmlException("Not a valid electrode file");
         nameSpace = xr.NamespaceURI;
         type = xr["Type", nameSpace];
         xr.ReadStartElement("Electrodes");
     }
     catch (Exception x)
     {
         throw new Exception("ElectrodeFileStream: " + x.Message);
     }
     ElectrodeRecord etrRecord;
     while (xr.Name == "Electrode")
     {
         try
         {
             if (type == "PhiTheta") etrRecord = new PhiThetaRecord();
             else if (type == "XY") etrRecord = new XYRecord();
             else if (type == "XYZ") etrRecord = new XYZRecord();
             else throw new Exception("Invalid electrode type");
             etrRecord.read(xr, nameSpace);
         }
         catch (XmlException e)
         {
             throw new Exception("ElectrodeFileStream: " + e.Message);
         }
         etrPositions.Add(etrRecord.Name, etrRecord);
     }
     xr.Close();
 }
 internal void addPointToView(XYZRecord xyz)
 {
     Triple t = new Triple(xyz.X, xyz.Y, xyz.Z);
     t = projection.PerspectiveProject(t);
     if (t.v3 <= 0) return;
     Ellipse circle = new Ellipse();
     circle.Stroke = System.Windows.Media.Brushes.Transparent;
     int pink = Math.Min((int)(10 * Math.Pow(t.v3,0.75)), 180);
     circle.Fill = new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, (byte)pink, (byte)pink));
     double r = Math.Max(100D / t.v3, 2.5D);
     circle.Height = circle.Width = r * 2D;
     Canvas.SetTop(circle, Draw.ActualHeight / 2 - viewScale * t.v2 - r);
     Canvas.SetLeft(circle, Draw.ActualWidth / 2 + viewScale * t.v1 - r);
     Canvas.SetZIndex(circle, (int)(-t.v3 * 100));
     circle.ToolTip = new TextBlock(new Run(xyz.Name));
     circle.MouseDown+=new MouseButtonEventHandler(circle_MouseDown);
     Draw.Children.Add(circle);
 }