private AncPersonSegment TraverseAncestors(GDMIndividualRecord iRec, float v, int gen, float rad, float ro, int prevSteps, int groupIndex) { try { fIndividualsCount++; if (fGroupsMode && groupIndex == -1) { AncPersonSegment otherSegment = (AncPersonSegment)FindSegmentByRec(iRec); if (otherSegment != null) { fGroupCount++; groupIndex = fGroupCount; TraverseGroups(otherSegment, groupIndex); } } int genSize = 1 << gen; float ang = (360.0f / genSize); int idx = prevSteps + (int)(v / ang); AncPersonSegment segment = SetSegmentParams(idx, iRec, rad, groupIndex); if (segment != null && gen < fVisibleGenerations) { float inRad = rad; float extRad = rad + fGenWidth; segment.IntRad = inRad - 50; segment.ExtRad = extRad - 50; GDMIndividualRecord father = null, mother = null; GDMFamilyRecord fam = fBase.Context.Tree.GetParentsFamily(iRec); if (fam != null && fBase.Context.IsRecordAccess(fam.Restriction)) { fBase.Context.Tree.GetSpouses(fam, out father, out mother); } int ps = prevSteps + genSize; if (father != null) { v -= (Math.Abs(ang - ro) / 2.0f); segment.FatherSegment = TraverseAncestors(father, v, gen + 1, rad + fGenWidth, ro / 2.0f, ps, groupIndex); } if (mother != null) { v += (ang / 2.0f); segment.MotherSegment = TraverseAncestors(mother, v, gen + 1, rad + fGenWidth, ro / 2.0f, ps, groupIndex); } } return(segment); } catch { return(null); } }
public void DrawAncestors() { int numberOfSegments = fSegments.Count; for (int i = 0; i < numberOfSegments; i++) { AncPersonSegment segment = (AncPersonSegment)fSegments[i]; bool draw = (!fOptions.HideEmptySegments || segment.IRec != null); if (draw) { int brIndex; if (fGroupsMode) { brIndex = (segment.GroupIndex == -1) ? 11 : segment.GroupIndex; } else { brIndex = (segment.Gen == 0) ? CircleChartModel.CENTRAL_INDEX : segment.Gen - 1; } IBrush brush = (fSelected == segment) ? fDarkBrushes[brIndex] : fCircleBrushes[brIndex]; DrawSegment(segment, fPen, brush); } } }
public void DrawAncestors() { int numberOfSegments = fSegments.Count; for (int i = 0; i < numberOfSegments; i++) { AncPersonSegment segment = (AncPersonSegment)fSegments[i]; bool draw = (!Options.HideEmptySegments || segment.IRec != null); if (draw) { int brIndex; if (fGroupsMode) { brIndex = (segment.GroupIndex == -1) ? 11 : segment.GroupIndex; } else { brIndex = (segment.Gen == 0) ? CircleChartModel.CENTRAL_INDEX : segment.Gen - 1; } IBrush brush = (fSelected == segment) ? fDarkBrushes[brIndex] : fCircleBrushes[brIndex]; IGfxPath path = segment.Path; fRenderer.FillPath(brush, path); fRenderer.DrawPath(fPen, path); } DrawPersonName(fSegments[i]); } }
private AncPersonSegment SetSegmentParams(int index, GDMIndividualRecord rec, float rad, int groupIndex) { if (index < 0 || index >= fSegments.Count) { return(null); } AncPersonSegment segment = (AncPersonSegment)fSegments[index]; segment.IRec = rec; segment.Rad = rad; segment.GroupIndex = groupIndex; return(segment); }
private static void TraverseGroups(AncPersonSegment segment, int groupIndex) { if (segment == null) { return; } segment.GroupIndex = groupIndex; if (segment.FatherSegment != null) { TraverseGroups(segment.FatherSegment, groupIndex); } if (segment.MotherSegment != null) { TraverseGroups(segment.MotherSegment, groupIndex); } }
public AncPersonSegment(int generation) : base(generation) { GroupIndex = -1; FatherSegment = null; MotherSegment = null; }
public void BuildAncTree() { fSegments.Clear(); const float startRad = CircleChartModel.CENTER_RAD - 50; float inRad = startRad; AncPersonSegment segment = new AncPersonSegment(0); DefineSegment(segment, 0, 0, inRad, 0 - 90.0f, 360.0f); fSegments.Add(segment); int maxSteps = 1; for (int gen = 1; gen <= fVisibleGenerations; gen++) { inRad = startRad + ((gen - 1) * fGenWidth); float extRad = inRad + fGenWidth; maxSteps *= 2; float wedgeAngle = (360.0f / maxSteps); for (int step = 0; step < maxSteps; step++) { float startAngle = (step * wedgeAngle) - 90.0f; segment = new AncPersonSegment(gen); DefineSegment(segment, 0, inRad, extRad, startAngle, wedgeAngle); fSegments.Add(segment); } } // traverse tree fGroupCount = -1; fIndividualsCount = 0; if (fRootPerson == null) { return; } fIndividualsCount++; AncPersonSegment rootSegment = SetSegmentParams(0, fRootPerson, 0, -1); if (rootSegment == null) { return; } rootSegment.WedgeAngle = 360.0f; GDMIndividualRecord father = null, mother = null; GDMFamilyRecord fam = fRootPerson.GetParentsFamily(); if (fam != null && fBase.Context.IsRecordAccess(fam.Restriction)) { father = fam.Husband.Individual; mother = fam.Wife.Individual; } if (mother != null) { rootSegment.MotherSegment = TraverseAncestors(mother, 90f, 1, CircleChartModel.CENTER_RAD, 90.0f, 1, -1); } if (father != null) { rootSegment.FatherSegment = TraverseAncestors(father, 270.0f, 1, CircleChartModel.CENTER_RAD, 90.0f, 1, -1); } }
public void BuildAncTree() { fSegments.Clear(); const float startRad = CircleChartModel.CENTER_RAD - 50; float inRad = startRad; AncPersonSegment segment = new AncPersonSegment(0); segment.IntRad = 0; segment.ExtRad = inRad; segment.StartAngle = 0 - 90.0f; segment.WedgeAngle = segment.StartAngle + 360.0f; IGfxPath path = segment.Path; path.StartFigure(); path.AddEllipse(-inRad, -inRad, inRad * 2.0f, inRad * 2.0f); path.CloseFigure(); fSegments.Add(segment); int maxSteps = 1; for (int gen = 1; gen <= fMaxGenerations; gen++) { inRad = startRad + ((gen - 1) * fGenWidth); float extRad = inRad + fGenWidth; maxSteps *= 2; float stepAngle = (360.0f / maxSteps); for (int step = 0; step < maxSteps; step++) { float ang1 = (step * stepAngle) - 90.0f; float ang2 = ang1 + stepAngle; segment = new AncPersonSegment(gen); segment.StartAngle = ang1; segment.WedgeAngle = stepAngle; fRenderer.CreateCircleSegment(segment.Path, inRad, extRad, stepAngle, ang1, ang2); fSegments.Add(segment); } } // traverse tree fGroupCount = -1; fIndividualsCount = 0; if (fRootPerson == null) { return; } fIndividualsCount++; AncPersonSegment rootSegment = SetSegmentParams(0, fRootPerson, 0, -1); if (rootSegment == null) { return; } rootSegment.WedgeAngle = 360.0f; GEDCOMIndividualRecord father = null, mother = null; GEDCOMFamilyRecord fam = fRootPerson.GetParentsFamily(); if (fam != null && fBase.Context.IsRecordAccess(fam.Restriction)) { father = fam.GetHusband(); mother = fam.GetWife(); } if (mother != null) { rootSegment.MotherSegment = TraverseAncestors(mother, 90f, 1, CircleChartModel.CENTER_RAD, 90.0f, 1, -1); } if (father != null) { rootSegment.FatherSegment = TraverseAncestors(father, 270.0f, 1, CircleChartModel.CENTER_RAD, 90.0f, 1, -1); } }