private void RenderPolylinePrimitive(Graphics g, PolylineRecord polyline) { // this line cap size and scaling was accomplished after a lot of tinkering // and working around limitations of the System.Drawing library that does // things weird when the pen width is less than 2 pixels var penWidth = ScaleLineWidth(polyline.LineWidth); var scaleStroke = Math.Max(1.0f, (polyline.LineShapeSize + 1)); var scaleFill = Math.Max(1.0f, (polyline.LineShapeSize + 1)); if (polyline.LineWidth == 0) { // if line width is 0 (hairline) then here we use 1 pixel as things go badly // if the pen width is close to zero scaleStroke *= ScaleLineWidth(LineWidth.Small); scaleFill *= ScaleLineWidth(LineWidth.Small) * 0.5f; penWidth = 1.0f; } else if (penWidth < 2.0f) { scaleStroke *= 1.0f; scaleFill *= ScaleLineWidth(LineWidth.Small) * 0.5f; } using (var pen = CreatePen(polyline.Color, penWidth)) { pen.DashCap = DashCap.Round; switch (polyline.LineStyle) { case LineStyle.Dashed: pen.DashStyle = DashStyle.Dash; break; case LineStyle.Dotted: pen.DashStyle = DashStyle.Dot; break; default: pen.DashStyle = DashStyle.Solid; break; } if (polyline.StartLineShape != LineShape.None) { pen.StartCap = LineCap.Custom; pen.CustomStartCap = GetLineShapeCap(polyline.StartLineShape, scaleFill, scaleStroke); } if (polyline.EndLineShape != LineShape.None) { pen.EndCap = LineCap.Custom; pen.CustomEndCap = GetLineShapeCap(polyline.EndLineShape, scaleFill, scaleStroke); } var points = polyline.Location.Select(loc => ScreenFromWorld(loc)).ToArray(); g.DrawLines(pen, points); } }
/// <summary> /// Instantiates a record according to its record type number. /// </summary> /// <param name="recordType">Integer representing the record type.</param> /// <returns>A new empty instance of a record primitive.</returns> private SchPrimitive CreateRecord(int recordType) { SchPrimitive record; switch (recordType) { case 1: record = new SchComponent(); break; case 2: record = new PinRecord(); break; case 3: record = new SymbolRecord(); break; case 4: record = new TextStringRecord(); break; case 5: record = new BezierRecord(); break; case 6: record = new PolylineRecord(); break; case 7: record = new PolygonRecord(); break; case 8: record = new EllipseRecord(); break; case 9: record = new PieChartRecord(); break; case 10: record = new RoundedRectangleRecord(); break; case 11: record = new EllipticalArcRecord(); break; case 12: record = new ArcRecord(); break; case 13: record = new LineRecord(); break; case 14: record = new RectangleRecord(); break; case 28: case 209: record = new TextFrameRecord(); break; case 30: record = new ImageRecord(); break; case 34: record = new Record34(); break; case 41: record = new Record41(); break; case 44: record = new Record44(); break; case 45: record = new Record45(); break; case 46: record = new Record46(); break; case 48: record = new Record48(); break; default: EmitWarning($"Record {recordType} not supported"); record = new SchPrimitive(); break; } return(record); }