private ActiveNode TryBreakHere( IParagraphModel <TLine, TState> paragraph, IFrameModel frame, IBreakPoint breakPoint, ActiveNode prevNode, out bool doDeactivate) { var nextLineNumber = prevNode.LineNumber + 1; var suitableLength = frame.LengthOf(nextLineNumber); var constraint = new LineConstraint { SuitableLength = suitableLength }; var newStyle = new TState(); var line = paragraph.CreateLine(constraint, prevNode.Point, breakPoint, prevNode.Style, out newStyle); double ratio = _evaluator.ComputeAdjustmentRatio(line, suitableLength); doDeactivate = (ratio < -1 || _evaluator.IsForcedBreakPoint(breakPoint)); if (-1 <= ratio && ratio <= _tolerance) { var fitnessClass = _evaluator.ComputeFitnessClass(ratio); var prevIsFlagged = prevNode.Point.IsFlagged; var prevFitnessClass = prevNode.FitnessClass; var demerits = _evaluator.ComputeDemerits(breakPoint, ratio, fitnessClass, prevIsFlagged, prevFitnessClass); return(ActiveNode.CreateBreakNode(breakPoint, line, fitnessClass, newStyle, ratio, demerits, prevNode)); } else { return(null); } }
public static object WrapEventArgs(EventArgs eventArgs, IFrameModel frameModel) { if (eventArgs is EPSPQuakeEventArgs quake) { return(new EPSPQuakeView() { EventArgs = quake, FrameModel = frameModel }); } if (eventArgs is EPSPTsunamiEventArgs tsunami) { return(new EPSPTsunamiView() { EventArgs = tsunami, FrameModel = frameModel }); } if (eventArgs is EPSPEEWTestEventArgs eew) { return(new EPSPEEWTestView() { EventArgs = eew }); } if (eventArgs is UserquakeEvaluateEventArgs userquake) { return(new EPSPUserquakeView(userquake, frameModel)); } return(null); }
public IEnumerable <TLine> Layout(IParagraphModel <TLine, TState> paragraph, IFrameModel frame) { var track = ComputeBreakPoints(paragraph, frame); if (track.Count == 0) { return(new TLine[] { ForceLayoutInOneLine(paragraph, frame).Justify(1) }); } else { return(from x in track select x.CreateLine()); } }
public List <IFrameModel> CreateFrames(string line, List <MPoint> Points, List <string> LineAssigment, List <Story> Stories, List <ISection> Sections) { var Temp = line.Split(); var Name = Temp[4].Replace("\"", ""); var Type = Temp[6].Replace("\"", ""); var point1 = Points.Find(x => x.Name == Temp[8].Replace("\"", "")); var point2 = Points.Find(x => x.Name == Temp[10].Replace("\"", "")); var Range = LineAssigment.FindAll(x => x.Contains($" {Name} ")); IFrameModel frame = null; List <IFrameModel> Frames = new List <IFrameModel>(); foreach (string LineAssign in LineAssigment) { var prop = LineAssign.Split(); Story story = Stories.Find(x => x.StoryName == prop[6].Replace("\"", "")); ISection section = Sections.Find(x => x._Name == prop[9].Replace("\"", "")); if (section._Material.tipo_Material == Enum_Material.Concrete) { frame = new ConcreteFrameModel(Name, point1, point2, story, section); } else if (section._Material.tipo_Material == Enum_Material.Steel) { frame = new SteelFrameModel(Name, point1, point2, story, section); } if (Type == "COLUMN") { frame.Frame_Type = Enum_Frame_Type.COLUMN; } else if (Type == "BEAM") { frame.Frame_Type = Enum_Frame_Type.BEAM; } Frames.Add(frame); } return(Frames); }
private List <ActiveNode> ComputeBreakPoints(IParagraphModel <TLine, TState> paragraph, IFrameModel frame) { var startNode = ActiveNode.CreateStartNode(paragraph.StartPoint); var storedActiveNodeList = new LinkedList <ActiveNode>(); storedActiveNodeList.AddLast(startNode); foreach (var breakPoint in paragraph.FeasibleBreakPoints) { var breakPointNodes = new HashSet <ActiveNode>(); var activeNodeNode = storedActiveNodeList.First; while (activeNodeNode != null) { ActiveNode activeNode = activeNodeNode.Value; bool doDeactivate; ActiveNode nextNode = TryBreakHere(paragraph, frame, breakPoint, activeNode, out doDeactivate); if (nextNode != null) { bool betterThanTheOthers = AddBetterActiveNode(breakPointNodes, nextNode); #if TRACE_TRY_BREAK Console.WriteLine("#ACTIVATE | {0}", nextNode); if (betterThanTheOthers) { Console.WriteLine("#...BETTER |"); } #endif } var next = activeNodeNode.Next; if (doDeactivate) { storedActiveNodeList.Remove(activeNodeNode); #if TRACE_TRY_BREAK if (nextNode != null) { Console.WriteLine("#ACCEPT From| {0:12} | To:{1:12}", activeNode, nextNode); } else { Console.WriteLine("#DECLINE From| {0:12}", activeNode); } #endif } activeNodeNode = next; } MergeActiveNodes(storedActiveNodeList, breakPointNodes); } var endedNodes = (from x in storedActiveNodeList where x.Point == paragraph.EndPoint select x); if (IsNotEmpty(endedNodes)) { var bestNode = FindTheWorstDemerits(endedNodes); storedActiveNodeList.Clear(); return(bestNode.TrackFromStartToHere()); } else { //失敗した場合は一行におさめる var line = ForceLayoutInOneLine(paragraph, frame); return(new List <ActiveNode> { ActiveNode.CreateBreakNode(paragraph.EndPoint, line, FitnessClass.Tight /*dummy*/, null, 0.0, 0.0, startNode) }); } }
private static IUnjustifiedLine <TLine> ForceLayoutInOneLine(IParagraphModel <TLine, TState> paragraph, IFrameModel frame) { var length = frame.LengthOf(1); var constraint = new LineConstraint { SuitableLength = length }; var style = new TState(); var ignore = new TState(); var unjustifiedLine = paragraph.CreateLine(constraint, paragraph.StartPoint, paragraph.EndPoint, style, out ignore); return(unjustifiedLine); }
public IEnumerable <TLine> Layout(IEnumerable <IParagraphModel <TLine, TState> > paragraphs, IFrameModel frame) { foreach (var p in paragraphs) { foreach (var l in Layout(p, frame)) { yield return(l); } } }