internal static ManifestCompilationResult Compile(string AppName, int BackgroundColor, bool LightForegroundText, bool ShowNameOnSquare150x150Logo, byte[] Square70x70LogoData, byte[] Square150x150LogoData, string Square70x70LogoName, string Square150x150LogoName, string OptionalSquare70x70LogoFormat = null, string OptionalSquare150x150LogoFormat = null, string OptionalSquare70x70LogoDirectoryPath = null, string OptionalSquare150x150LogoDirectoryPath = null) { var Square70x70LogoFormat = OptionalSquare70x70LogoFormat ?? ImageService.GetFormat(Square70x70LogoData); var Square150x150LogoFormat = OptionalSquare150x150LogoFormat ?? ImageService.GetFormat(Square150x150LogoData); var Square70x70LogoDirectoryPath = OptionalSquare70x70LogoDirectoryPath ?? string.Empty; var Square150x150LogoDirectoryPath = OptionalSquare150x150LogoDirectoryPath ?? string.Empty; var Square70x70LogoFullName = PathService.CombineName(Square70x70LogoName, Square70x70LogoFormat); var Square150x150LogoFullName = PathService.CombineName(Square150x150LogoName, Square150x150LogoFormat); var Square70x70LogoPath = PathService.CombinePath(Square70x70LogoDirectoryPath, Square70x70LogoFullName); var Square150x150LogoPath = PathService.CombinePath(Square150x150LogoDirectoryPath, Square150x150LogoFullName); var VisualElements = new VisualElements(); VisualElements.SetBackgroundColorOn(BackgroundColor); VisualElements.SetForegroundTextOn(LightForegroundText); VisualElements.SetShowNameOnSquare150x150LogoOn(ShowNameOnSquare150x150Logo); VisualElements.SetSquare70x70LogoOn(Square70x70LogoPath); VisualElements.SetSquare150x150LogoOn(Square150x150LogoPath); var Manifest = VisualElementsManifest.ManifestService.Create(VisualElements); var ManifestData = StringFormatter.Serialize(Manifest); var ManifestFileName = ManifestNameBuilder.Build(AppName); var Components = new Dictionary <ManifestComponentType, ManifestComponentData>() { { ManifestComponentType.Manifest, new ManifestComponentData(ManifestData, ManifestFileName) }, { ManifestComponentType.Square70x70Logo, new ManifestComponentData(Square70x70LogoData, Square70x70LogoPath) }, { ManifestComponentType.Square150x150Logo, new ManifestComponentData(Square150x150LogoData, Square150x150LogoPath) }, }; return(new ManifestCompilationResult(Components)); }
public void LoadSession() { string fileName, title; if (!OpenFileDialog(false, out fileName, out title)) { return; } lastOpenedFile = fileName; lastOpenedFileTitle = title; BinaryFormatter bf = new BinaryFormatter(); using (FileStream fs = new FileStream(fileName, FileMode.Open)) { CurrentSession = (TaskSession)bf.Deserialize(fs); } CurrentSession.VisualElements = VisualElements; CurrentSession.Client = new AwesomiumWrap(); VisualElements.Clear(); foreach (var e in CurrentSession.FunctionalElements) { CurrentSession.RestoreTask(e); } this.Title = title; Log(LogType.Message, "Session {0} was loaded", title); }
public void PaintSimulationZone(ISimulationGeneratorFactors factor, VisualElements visualElement) { string factorValue1 = factor.GetFactorValue(FactorName1); string factorValue2 = factor.GetFactorValue(FactorName2); int index1 = values1.IndexOf(factorValue1); if (index1 == -1) { values1.Add(factorValue1); index1 = values1.Count - 1; } int index2 = values2.IndexOf(factorValue2); if (index2 == -1) { values2.Add(factorValue2); index2 = values2.Count - 1; } index1 = index1 % MaximumIndex1; index2 = index2 % MaximumIndex2; Setter1(visualElement, index1); Setter2(visualElement, index2); }
private void InitializeVisualElements(IEnumerable <T> source) { VisualElements.Clear(); foreach (var element in source) { VisualElements.Add(element); } }
public VisualElementManagerMock(IEnumerable <Step> stepsToUseForInitialize) : this() { foreach (var step in stepsToUseForInitialize) { VisualElements.Add(new VisualElement(null) { ElementID = step.ElementID, WindowID = Guid.Parse("df575070-f243-4e6d-bc14-a5196294cedf"), }); } }
private void LoadSelectedItem() { CurrentVisualElements = new VisualElements(CurrentMenuItem.ManifestPath); TargetLabel.Text = CurrentMenuItem.Target; MediumTilePreview.Text = CurrentMenuItem.Name; BackgroundTextBox.Text = CurrentVisualElements.BackgroundColor != Color.Empty ? ColorTranslator.ToHtml(CurrentVisualElements.BackgroundColor) : ""; ForegroundDropdown.SelectedItem = CurrentVisualElements.ForegroundText; MediumTilePreview.TileImage = CurrentMenuItem.Icon; MediumLogoTextBox.Text = CurrentVisualElements.MediumLogo; SmallLogoTextBox.Text = CurrentVisualElements.SmallLogo; ShowNameToggle.Checked = CurrentVisualElements.ShowNameOnMediumLogo; ResetButton.Enabled = CurrentVisualElements.UserGenerated; }
public void PaintSimulationZone(ISimulationGeneratorFactors factor, VisualElements visualElement) { string factorValue = factor.GetFactorValue(FactorName); int index = values.IndexOf(factorValue); if (index == -1) { values.Add(factorValue); index = values.Count - 1; } index = index % MaximumIndex; Setter(visualElement, index); }
public void RebuildLayout() { if (LayoutChanges.Count == 1 && LayoutChanges[0] is PropertyChange pc && pc.Property == nameof(LeftHanded)) { if (VisualElements.Count > 0) { VisualElements.ForEach(e => e.FlipHandedness()); isLayoutDirty = false; LayoutChanges.Clear(); OnLayoutUpdated(); return; } } VisualElements.Clear(); for (int i = 0; i < NumberOfStrings; i++) { Strings[i].ClearLayoutData(); } _CachedBounds = RectangleM.Empty; if (StringSpacing is StringSpacingSimple) { (StringSpacing as StringSpacingSimple).CalculateAdjustedPositions(); } Measure nutCenter = Measure.Zero; Measure bridgeCenter = Measure.Zero; Measure[] nutStringPos = StringSpacing.GetStringPositions(FingerboardEnd.Nut, out nutCenter); Measure[] bridgeStringPos = StringSpacing.GetStringPositions(FingerboardEnd.Bridge, out bridgeCenter); LayoutStrings(nutStringPos, bridgeStringPos); CreateFingerboardEdges(); PlaceFrets(); FinishFingerboardShape(); var layoutBounds = GetLayoutBounds(); VisualElements.Add(new LayoutLine(new PointM(Measure.Zero, layoutBounds.Top), new PointM(Measure.Zero, layoutBounds.Bottom), VisualElementType.CenterLine)); if (LeftHanded) { VisualElements.ForEach(e => e.FlipHandedness()); } isLayoutDirty = false; LayoutChanges.Clear(); OnLayoutUpdated(); }
public void buildgraph() { SeriesCollection.Clear(); VisualElements.Clear(); SeriesCollection.Add( new StackedColumnSeries { Values = new ChartValues <double> { 4, 5, 6, 8 }, StackMode = StackMode.Values, // this is not necessary, values is the default stack mode DataLabels = true } ); SeriesCollection.Add( new StackedColumnSeries { Values = new ChartValues <double> { 2, 5, 6, 7 }, StackMode = StackMode.Values, DataLabels = true } ); //adding series updates and animates the chart SeriesCollection.Add(new StackedColumnSeries { Values = new ChartValues <double> { 6, 2, 7 }, StackMode = StackMode.Values }); //adding values also updates and animates SeriesCollection[2].Values.Add(4d); Labels = new[] { "Chrome", "Mozilla", "Opera", "IE" }; VisualElementTest vstest = new VisualElementTest(); countpos++; VisualElements.Add(vstest.visual); DataContext = this; }
public void PaintSimulationZone(ISimulationGeneratorFactors factor, VisualElements visualElement, Series series) { string factorValue = factor.GetFactorValue(FactorName); int index1 = values.IndexOf(factorValue); if (index1 == -1) { values.Add(factorValue); index1 = values.Count - 1; } int index2 = index1 / MaximumIndex1; index2 = index2 % MaximumIndex2; index1 = index1 % MaximumIndex1; Setter1(visualElement, index1); Setter2(visualElement, index2); }
internal static ManifestCompilationResult Compile(string AppName, int BackgroundColor, bool LightForegroundText, bool ShowNameOnSquare150x150Logo) { var VisualElements = new VisualElements(); VisualElements.SetBackgroundColorOn(BackgroundColor); VisualElements.SetForegroundTextOn(LightForegroundText); VisualElements.SetShowNameOnSquare150x150LogoOn(ShowNameOnSquare150x150Logo); var Manifest = VisualElementsManifest.ManifestService.Create(VisualElements); var ManifestData = StringFormatter.Serialize(Manifest); var ManifestFileName = ManifestNameBuilder.Build(AppName); var Components = new Dictionary <ManifestComponentType, ManifestComponentData>() { { ManifestComponentType.Manifest, new ManifestComponentData(ManifestData, ManifestFileName) } }; return(new ManifestCompilationResult(Components)); }
internal LayoutLine GetStringBoundaryLine(SIString str, FingerboardSide dir) { LayoutLine boundary = null; if (dir == FingerboardSide.Bass) { boundary = VisualElements.OfType <StringCenter>().FirstOrDefault(c => c.Right.Index == str.Index); } else { boundary = VisualElements.OfType <StringCenter>().FirstOrDefault(c => c.Left.Index == str.Index); } if (boundary == null) { return(VisualElements.OfType <FingerboardSideEdge>().First(e => e.Side == dir)); } return(boundary); }
public void PaintSimulationZone(ISimulationGeneratorFactors factor, VisualElements visualElement, Series series) { int index; if (FactorName == "Graph series") { index = (series.Parent as Graph).Series.IndexOf(series); } else { string factorValue = factor.GetFactorValue(FactorName); index = values.IndexOf(factorValue); if (index == -1) { values.Add(factorValue); index = values.Count - 1; } } index = index % MaximumIndex; Setter(visualElement, index); }
public void PaintSimulationZone(ISimulationGeneratorFactors factor, VisualElements visualElement) { visualElement.colour = Colour; visualElement.Line = LineType; visualElement.Marker = MarkerType; }
public void Clear() { _visualStart = 0; _elements.Clear(); VisualElements.Clear(); }
/// <summary>A static setter function for line type from an index</summary> /// <param name="visualElement">The visual element to change</param> /// <param name="index">The index</param> public static void SetLineType(VisualElements visualElement, int index) { visualElement.Line = (LineType)Enum.GetValues(typeof(LineType)).GetValue(index); }
/// <summary>A static setter function for marker from an index</summary> /// <param name="visualElement">The visual element to change</param> /// <param name="index">The index</param> public static void SetMarker(VisualElements visualElement, int index) { visualElement.Marker = (MarkerType)Enum.GetValues(typeof(MarkerType)).GetValue(index); }
/// <summary> /// Paint the visual elements (colour, line and marker) of all simulation / zone pairs. /// </summary> /// <param name="factors">The simulation/zone pairs to change</param> /// <param name="storage">Storage reader</param> /// <param name="baseData">Base data</param> private List <SeriesDefinition> ConvertToSeriesDefinitions(List <ISimulationGeneratorFactors> factors, IStorageReader storage, DataTable baseData) { // Create an appropriate painter object SimulationZonePainter.IPainter painter; if (FactorToVaryColours != null) { if (FactorToVaryLines == FactorToVaryColours) { painter = new SimulationZonePainter.SequentialPainterTwoFactors() { FactorName = FactorToVaryColours, MaximumIndex1 = ColourUtilities.Colours.Length, MaximumIndex2 = Enum.GetValues(typeof(LineType)).Length - 1, // minus 1 to avoid None type Setter1 = VisualElements.SetColour, Setter2 = VisualElements.SetLineType } } ; else if (FactorToVaryMarkers == FactorToVaryColours) { painter = new SimulationZonePainter.SequentialPainterTwoFactors() { FactorName = FactorToVaryColours, MaximumIndex1 = ColourUtilities.Colours.Length, MaximumIndex2 = Enum.GetValues(typeof(MarkerType)).Length - 1,// minus 1 to avoid None type Setter1 = VisualElements.SetColour, Setter2 = VisualElements.SetMarker } } ; else if (FactorToVaryLines != null) { painter = new SimulationZonePainter.DualPainter() { FactorName1 = FactorToVaryColours, FactorName2 = FactorToVaryLines, MaximumIndex1 = ColourUtilities.Colours.Length, MaximumIndex2 = Enum.GetValues(typeof(LineType)).Length - 1, // minus 1 to avoid None type Setter1 = VisualElements.SetColour, Setter2 = VisualElements.SetLineType } } ; else if (FactorToVaryMarkers != null) { painter = new SimulationZonePainter.DualPainter() { FactorName1 = FactorToVaryColours, FactorName2 = FactorToVaryMarkers, MaximumIndex1 = ColourUtilities.Colours.Length, MaximumIndex2 = Enum.GetValues(typeof(MarkerType)).Length - 1,// minus 1 to avoid None type Setter1 = VisualElements.SetColour, Setter2 = VisualElements.SetMarker } } ; else { painter = new SimulationZonePainter.SequentialPainter() { FactorName = FactorToVaryColours, MaximumIndex = ColourUtilities.Colours.Length, Setter = VisualElements.SetColour } }; } else if (FactorToVaryLines != null) { painter = new SimulationZonePainter.SequentialPainter() { FactorName = FactorToVaryLines, MaximumIndex = Enum.GetValues(typeof(LineType)).Length - 1, // minus 1 to avoid None type Setter = VisualElements.SetLineType }; } else if (FactorToVaryMarkers != null) { painter = new SimulationZonePainter.SequentialPainter() { FactorName = FactorToVaryMarkers, MaximumIndex = Enum.GetValues(typeof(MarkerType)).Length - 1,// minus 1 to avoid None type Setter = VisualElements.SetMarker }; } else { painter = new SimulationZonePainter.DefaultPainter() { Colour = Colour, LineType = Line, MarkerType = Marker } }; List <SeriesDefinition> definitions = new List <SeriesDefinition>(); // Apply the painter to all simulation zone objects. foreach (ISimulationGeneratorFactors factor in factors) { VisualElements visualElement = new VisualElements(); visualElement.colour = Colour; visualElement.Line = Line; visualElement.LineThickness = LineThickness; visualElement.Marker = Marker; visualElement.MarkerSize = MarkerSize; painter.PaintSimulationZone(factor, visualElement); SeriesDefinition seriesDefinition = new Models.Graph.SeriesDefinition(); seriesDefinition.type = Type; seriesDefinition.marker = visualElement.Marker; seriesDefinition.line = visualElement.Line; seriesDefinition.markerSize = visualElement.MarkerSize; seriesDefinition.lineThickness = visualElement.LineThickness; seriesDefinition.colour = visualElement.colour; seriesDefinition.xFieldName = XFieldName; seriesDefinition.yFieldName = YFieldName; seriesDefinition.xAxis = XAxis; seriesDefinition.yAxis = YAxis; seriesDefinition.xFieldUnits = storage.GetUnits(TableName, XFieldName); seriesDefinition.yFieldUnits = storage.GetUnits(TableName, YFieldName); seriesDefinition.showInLegend = ShowInLegend; factor.Factors.ForEach(f => seriesDefinition.title += f.Value); if (IncludeSeriesNameInLegend) { seriesDefinition.title += ": " + Name; } if (Checkpoint != "Current") { seriesDefinition.title += " (" + Checkpoint + ")"; } DataView data = new DataView(baseData); try { data.RowFilter = CreateRowFilter(storage, new ISimulationGeneratorFactors[] { factor }, DataTableUtilities.GetColumnNames(baseData)); } catch { } if (data.Count > 0) { seriesDefinition.data = data.ToTable(); seriesDefinition.x = GetDataFromTable(seriesDefinition.data, XFieldName); seriesDefinition.y = GetDataFromTable(seriesDefinition.data, YFieldName); seriesDefinition.x2 = GetDataFromTable(seriesDefinition.data, X2FieldName); seriesDefinition.y2 = GetDataFromTable(seriesDefinition.data, Y2FieldName); seriesDefinition.error = GetErrorDataFromTable(seriesDefinition.data, YFieldName); if (Cumulative) { seriesDefinition.y = MathUtilities.Cumulative(seriesDefinition.y as IEnumerable <double>); } if (CumulativeX) { seriesDefinition.x = MathUtilities.Cumulative(seriesDefinition.x as IEnumerable <double>); } } definitions.Add(seriesDefinition); } return(definitions); }
/// <summary>A static setter function for colour from an index</summary> /// <param name="visualElement">The visual element to change</param> /// <param name="index">The index</param> public static void SetColour(VisualElements visualElement, int index) { visualElement.colour = ColourUtilities.Colours[index]; }
protected override void InitializeVisualElements() { _visualElements = new VisualElements("appbar_page_text", "Data Files", "View and manipulate data files"); }
private T AddVisualElement <T>(T elem) where T : VisualElement { VisualElements.Add(elem); elem.Layout = this; return(elem); }
internal StringCenter GetStringsCenter(SIString left, SIString right) { return(VisualElements.OfType <StringCenter>().FirstOrDefault(c => (left.Index == c.Right.Index || left.Index == c.Left.Index) && (right.Index == c.Right.Index || right.Index == c.Left.Index))); }
VisualElement IVisualElementManager.GetVisualElement(string elementID, bool includeUnloaded) { return(VisualElements.FirstOrDefault(e => e.ElementID == elementID)); }
public T GetElement <T>(Predicate <T> predicate) where T : VisualElement { return(VisualElements.OfType <T>().FirstOrDefault(x => predicate(x))); }
public IEnumerable <T> GetElements <T>(Predicate <T> predicate) where T : VisualElement { return(VisualElements.OfType <T>().Where(x => predicate(x))); }
public IEnumerable <T> GetElements <T>() where T : VisualElement { return(VisualElements.OfType <T>()); }
private void FinishFingerboardShape() { var trebleSideEdge = VisualElements.OfType <FingerboardSideEdge>().First(e => e.Side == FingerboardSide.Treble); var bassSideEdge = VisualElements.OfType <FingerboardSideEdge>().First(e => e.Side == FingerboardSide.Bass); var trebleNutFret = VisualElements.OfType <FretLine>().First(f => f.IsNut && f.Strings.Contains(FirstString)); var bassNutFret = VisualElements.OfType <FretLine>().First(f => f.IsNut && f.Strings.Contains(LastString)); //create inward fingerboard edges from nut if (!Strings.AllEqual(s => s.StartingFret)) { foreach (var str in Strings) { if (str.Next != null && str.StartingFret != str.Next.StartingFret) { var nut1 = VisualElements.OfType <FretLine>().First(f => f.IsNut && f.Strings.Contains(str)); var nut2 = VisualElements.OfType <FretLine>().First(f => f.IsNut && f.Strings.Contains(str.Next)); AddVisualElement(new FingerboardEdge(nut1.Points.First(), nut2.Points.Last()) { IsSideEdge = true }); //var center = GetStringBoundaryLine(str, FingerboardSide.Bass) as StringCenter; //var p1 = center.GetRelativePoint(str.LayoutLine, str.LayoutLine.P1); //var p2 = center.GetRelativePoint(str.Next.LayoutLine, str.Next.LayoutLine.P1); //AddVisualElement(new FingerboardEdge(p1, p2) { IsSideEdge = true }); } } } var trebSideNutInter = PointM.Empty; if (trebleNutFret.Intersects(trebleSideEdge, out trebSideNutInter)) { trebleSideEdge.P1 = trebSideNutInter; } var bassSideNutInter = PointM.Empty; if (bassNutFret.Intersects(bassSideEdge, out bassSideNutInter)) { bassSideEdge.P1 = bassSideNutInter; } trebleSideEdge.RealEnd = trebleSideEdge.P2; bassSideEdge.RealEnd = bassSideEdge.P2; var trebleLastFret = VisualElements.OfType <FretLine>().First(f => f.FretIndex == FirstString.NumberOfFrets && f.Strings.Contains(FirstString)); var bassLastFret = VisualElements.OfType <FretLine>().First(f => f.FretIndex == LastString.NumberOfFrets && f.Strings.Contains(LastString)); PointM trebleEndPoint = trebleLastFret.Points.Last(); PointM bassEndPoint = bassLastFret.Points.First(); if (!Margins.LastFret.IsEmpty) { trebleEndPoint += trebleSideEdge.Direction * Margins.LastFret; bassEndPoint += bassSideEdge.Direction * Margins.LastFret; } //split physical from virtual fingerboard var virtualTrebleEdge = AddVisualElement(new LayoutLine(trebleEndPoint, trebleSideEdge.P2, VisualElementType.FingerboardContinuation)); var virtualBassEdge = AddVisualElement(new LayoutLine(bassEndPoint, bassSideEdge.P2, VisualElementType.FingerboardContinuation)); trebleSideEdge.P2 = virtualTrebleEdge.P1; bassSideEdge.P2 = virtualBassEdge.P1; if (NumberOfStrings > 1) { var bridgeLine = new LayoutPolyLine(Strings.Select(s => s.LayoutLine.P2), VisualElementType.BridgeLine); VisualElements.Add(bridgeLine); var bridgeTrebleInter = PointM.Empty; if (bridgeLine.Intersects(virtualTrebleEdge, out bridgeTrebleInter)) { virtualTrebleEdge.P2 = bridgeTrebleInter; } var bridgeBassInter = PointM.Empty; if (bridgeLine.Intersects(virtualBassEdge, out bridgeBassInter)) { virtualBassEdge.P2 = bridgeBassInter; } } if (trebleLastFret.Strings.Count() == NumberOfStrings && trebleLastFret.IsStraight && trebleLastFret.FretIndex == MaximumFret) { AddVisualElement(new FingerboardEdge(bassSideEdge.P2, trebleSideEdge.P2)); } else if (!Margins.LastFret.IsEmpty) { var fretLines = VisualElements.OfType <FretLine>(); var edgePoints = new List <PointM>(); for (int i = NumberOfStrings - 1; i >= 0; i--) { var strLastFret = fretLines.First(fl => fl.FretIndex == Strings[i].NumberOfFrets && fl.Strings.Contains(Strings[i])); var trebleSide = GetStringBoundaryLine(Strings[i], FingerboardSide.Treble); var bassSide = GetStringBoundaryLine(Strings[i], FingerboardSide.Bass); var pt1 = PointM.Empty; var pt2 = PointM.Empty; if (!strLastFret.Intersects(bassSide, out pt1)) { pt1 = strLastFret.Points.First(); } if (!strLastFret.Intersects(trebleSide, out pt2)) { pt2 = strLastFret.Points.Last(); } pt1 += bassSide.Direction * Margins.LastFret; pt2 += trebleSide.Direction * Margins.LastFret; edgePoints.Add(pt1); edgePoints.Add(pt2); } //edgePoints.RemoveAll(p => p.IsEmpty); edgePoints = edgePoints.Distinct().ToList(); var fretboardEdge = AddVisualElement(new FingerboardEdge(edgePoints)); //fretboardEdge.InterpolateSpline(); } var fingerboardEnds = VisualElements.OfType <FingerboardEdge>(); var trebleLine = FirstString.LayoutLine; foreach (var end in fingerboardEnds) { if (end.Intersects(trebleLine, out PointM inter, false)) { AddVisualElement(new LayoutLine(trebleLine.P1, inter, VisualElementType.FingerboardMargin)); break; } } if (LastString != FirstString) { var bassLine = LastString.LayoutLine; foreach (var end in fingerboardEnds) { if (end.Intersects(bassLine, out PointM inter, false)) { AddVisualElement(new LayoutLine(bassLine.P1, inter, VisualElementType.FingerboardMargin)); break; } } } }
protected override void InitializeVisualElements() { _visualElements = new VisualElements("appbar_layer", "Workspace", "View and manipulate data files"); }
protected override void InitializeVisualElements() { _visualElements = new VisualElements("appbar_magnify", "Search", "Pick one of the search modes"); }
private void LayoutStrings(Measure[] nutStringPos, Measure[] bridgeStringPos) { var stringLines = VisualElements.OfType <StringLine>(); if (NumberOfStrings == 1) { ConstructString(Strings[0], nutStringPos[0], bridgeStringPos[0]); } else if (ScaleLengthMode != ScaleLengthType.Multiple) { var trebleStr = ConstructString(Strings[0], nutStringPos[0], bridgeStringPos[0]); var bassStr = ConstructString(Strings[NumberOfStrings - 1], nutStringPos[NumberOfStrings - 1], bridgeStringPos[NumberOfStrings - 1]); var maxHeight = Measure.Max(trebleStr.Bounds.Height, bassStr.Bounds.Height); AdjustStringVerticalPosition(trebleStr, maxHeight); AdjustStringVerticalPosition(bassStr, maxHeight); var nutLine = Line.FromPoints(trebleStr.P1.ToVector(), bassStr.P1.ToVector()); var bridgeLine = Line.FromPoints(trebleStr.P2.ToVector(), bassStr.P2.ToVector()); var twelfthFret = new LayoutLine(PointM.Average(trebleStr.P1, trebleStr.P2), PointM.Average(bassStr.P1, bassStr.P2)); //create the remaining strings by distributing them equally between the outer strings for (int i = 1; i < NumberOfStrings - 1; i++) { var nutPos = nutLine.GetPointForX(nutStringPos[i].NormalizedValue); var bridgePos = bridgeLine.GetPointForX(bridgeStringPos[i].NormalizedValue); var createdString = AddVisualElement(new StringLine(Strings[i], PointM.FromVector(nutPos, nutStringPos[i].Unit), PointM.FromVector(bridgePos, bridgeStringPos[i].Unit))); //strings distributed equally between the outer strings (which are tapered/angled) do not have their centers aligned //so we correct the string length (at bridge) so that its center is aligned with the twelfth fret var middle = createdString.GetIntersection(twelfthFret); var distFromNut = PointM.Distance(createdString.P1, middle); var distFromBridge = PointM.Distance(createdString.P2, middle); var stringCenterOffset = Measure.Abs(distFromNut - distFromBridge); if (!CompensateFretPositions && stringCenterOffset > Measure.Mm(0.05)) { //adjust the end of the string so that it's center is above the 12th fret createdString.P2 = createdString.P1 + (createdString.Direction * distFromNut * 2); } Strings[i].RecalculateLengths();//store the physical length of the string } } else { for (int i = 0; i < NumberOfStrings; i++) { ConstructString(Strings[i], nutStringPos[i], bridgeStringPos[i]); } //*** Adjust strings position for multiscale var maxPerpHeight = Measure.FromNormalizedValue(stringLines.Max(l => l.Bounds.Height.NormalizedValue), UnitOfMeasure.Mm); foreach (var strLine in stringLines) { AdjustStringVerticalPosition(strLine, maxPerpHeight); } } //calculate starting fret position if different from 0 (nut) foreach (var str in Strings) { if (str.StartingFret != 0) { var startingFretPosRatio = GetEqualTemperedFretPosition(str.StartingFret); var stringVector = str.PlaceFretsRelativeToString ? str.LayoutLine.Direction * -1 : new Vector(0, 1); var startingFretPos = str.LayoutLine.P2 + (stringVector * str.CalculatedLength * startingFretPosRatio); if (!str.PlaceFretsRelativeToString) { startingFretPos = str.LayoutLine.SnapToLine(startingFretPos, LineSnapDirection.Horizontal); } str.LayoutLine.P1 = startingFretPos; str.RecalculateLengths(); } } for (int i = 0; i < NumberOfStrings - 1; i++) { AddVisualElement(new StringCenter(Strings[i + 1].LayoutLine, Strings[i].LayoutLine)); } }