text:
ZedGraph is a class library, Windows Forms UserControl, and ASP web-accessible control for creating 2D line, bar, and pie graphs of arbitrary datasets. The classes provide a high degree of flexibility - almost every aspect of the graph can be user-modified. At the same time, usage of the classes is kept simple by providing default values for all of the graph attributes. The classes include code for choosing appropriate scale ranges and step sizes based on the range of data values being plotted. Moreover, ZedGraph is compatible with .NET 2.0, and VS .NET 2005.
ZedGraph is maintained as an open-source development project on SourceForge. The site includes a project Wiki, documentation, interim (CVS) updates, and all release versions.
A set of sample graphs is also available on the Wiki, complete with source code (many of the samples include C# and VB code).
ZedGraph now supports both .NET 2.0 and .NET 1.1.
There are many graphing libraries out there, but none seemed to fit what I needed. I found MSChart too quirky, and many of the other options did not have the flexibility I needed to achieve a polished look. Of course, most of the commercial packages would do the trick, but I needed something that was free. So, ZedGraph was born.
These classes will generate a variety of line, bar, or pie charts on a form or web page, given a location rectangle and some data points. ZedGraph handles 2D line/scatter graphs, horizontal/vertical bar graphs, stacked bar charts, stacked percent bar charts, error bar charts, open-high-low-close charts, Japanese candlestick charts, and pie charts - it does not yet handle 2.5D or 3D surfaces or charts. The charts can be dressed up with axis labels and titles, a legend, text labels and arrows (as shown in the example above), images, etc.
The ZedGraphWiki and the online class documentation provide lots of helpful tips and descriptions. Refer to them for more details - ZedGraph has a tremendous number of options that are not documented in this tutorial.
This article uses C# exclusively for examples, however, all the code samples for the tutorial, plus other examples are available for Visual Basic, on the ZedGraphWiki Sample Graphs section.
ZedGraph now includes a class derived from the Control class that facilitates access from ASPX web page code. The demo project download above demonstrates this functionality. Also, the ZedGraphWiki includes detailed examples of web control usage for two rendering modes, RawImage and ImageTag.
ZedGraph is accessible as a control from the control toolbox in Visual Studio .NET. To access ZedGraph, first launch Visual Studio .NET, and create a new Windows Application (Forms) project. Open the form design so that it appears in the current window. View the toolbox using the View/Toolbox menu command. Right-click inside the "General" or "Components" sub-pane of the tool box, and select the "Choose Items..." option. Click "Browse...", and navigate to the zedgraph.dll file. Once this file is added, you should see a ZedGraphControl option in the toolbox.
using ZedGraph;
// Respond to the form 'Resize' event private void Form1_Resize( object sender, EventArgs e ) { SetSize(); } // SetSize() is separate from Resize() so we can // call it independently from the Form1_Load() method // This leaves a 10 px margin around the outside of the control // Customize this to fit your needs private void SetSize() { zedGraphControl1.Location = new Point( 10, 10 ); // Leave a small margin around the outside of the control zedGraphControl1.Size = new Size( ClientRectangle.Width - 20, ClientRectangle.Height - 20 ); } // Respond to form 'Load' event private void Form1_Load( object sender, EventArgs e ) { // Setup the graph CreateGraph( zedGraphControl1 ); // Size the control to fill the form with a margin SetSize(); } // Build the Chart private void CreateGraph( ZedGraphControl zgc ) { // get a reference to the GraphPane GraphPane myPane = zgc.GraphPane; // Set the Titles myPane.Title.Text = "My Test Graph\n(For CodeProject Sample)"; myPane.XAxis.Title.Text = "My X Axis"; myPane.YAxis.Title.Text = "My Y Axis"; // Make up some data arrays based on the Sine function double x, y1, y2; PointPairList list1 = new PointPairList(); PointPairList list2 = new PointPairList(); for ( int i = 0; i < 36; i++ ) { x = (double)i + 5; y1 = 1.5 + Math.Sin( (double)i * 0.2 ); y2 = 3.0 * ( 1.5 + Math.Sin( (double)i * 0.2 ) ); list1.Add( x, y1 ); list2.Add( x, y2 ); } // Generate a red curve with diamond // symbols, and "Porsche" in the legend LineItem myCurve = myPane.AddCurve( "Porsche", list1, Color.Red, SymbolType.Diamond ); // Generate a blue curve with circle // symbols, and "Piper" in the legend LineItem myCurve2 = myPane.AddCurve( "Piper", list2, Color.Blue, SymbolType.Circle ); // Tell ZedGraph to refigure the // axes since the data have changed zgc.AxisChange(); }
Note that the AxisChange() method call must be made any time you add or change the data. This tells ZedGraph to go ahead and recalculate all the axis ranges. (Note: This is all AxisChange() does - you can call it anytime you like, and it will update the axis ranges based on the current set of data points. You can also avoid calling AxisChange() if you do not want the axes rescaled.)
The above code will generate the following output:
ZedGraph allows you to modify the graph attributes in a wide variety of ways. Each of the parts of the graph is encapsulated in a class structure, which has modifiable properties to control the output. The following are some of the classes provided in ZedGraph (Note that these classes are XML documented. See the ZedGraph documentation for details about each class.):
The graph is modified by accessing properties in each of the above classes. For example, if you include the following lines of code in your CreateGraph() method, after the code samples shown previously, the plot will be modified accordingly:
// Change the color of the title myPane.Title.FontSpec.FontColor = Color.Green; // Add gridlines to the plot, and make them gray myPane.XAxis.MajorGrid.IsVisible = true; myPane.YAxis.MajorGrid.IsVisible = true; myPane.XAxis.MajorGrid.Color = Color.LightGray; myPane.YAxis.MajorGrid.Color = Color.LightGray; // Move the legend location myPane.Legend.Position = ZedGraph.LegendPos.Bottom; // Make both curves thicker myCurve.Line.Width = 2.0F; myCurve2.Line.Width = 2.0F; // Fill the area under the curves myCurve.Line.Fill = new Fill( Color.White, Color.Red, 45F ); myCurve2.Line.Fill = new Fill( Color.White, Color.Blue, 45F ); // Increase the symbol sizes, and fill them with solid white myCurve.Symbol.Size = 8.0F; myCurve2.Symbol.Size = 8.0F; myCurve.Symbol.Fill = new Fill( Color.White ); myCurve2.Symbol.Fill = new Fill( Color.White ); // Add a background gradient fill to the axis frame myPane.Chart.Fill = new Fill( Color.White, Color.FromArgb( 255, 255, 210 ), -45F ); // Add a caption and an arrow TextObj myText = new TextObj( "Interesting\nPoint", 230F, 70F ); myText.FontSpec.FontColor = Color.Red; myText.Location.AlignH = AlignH.Center; myText.Location.AlignV = AlignV.Top; myPane.GraphObjList.Add( myText ); ArrowObj myArrow = new ArrowObj( Color.Red, 12F, 230F, 70F, 280F, 55F ); myPane.GraphObjList.Add( myArrow );
The final "dressed-up" graph will look like this:
Many more graph attributes can be modified, but listing them all in this article would be tedious. Please refer to the online documentation for more details. Also see the demo graphs on the Wiki for samples with code.
Drawing line graphs is no big deal, but there are some aspects of the drawing classes that proved to be interesting. The flexibility afforded by the transform matrix of the GDI+ drawing library is very cool. This allowed the same code to be employed for drawing all three of the axes. The coordinate system is transformed to accommodate the axis location and orientation. In each case, the coordinate system is translated and rotated so that the axis is oriented along the X direction and the origin is located at the left edge of the axis when facing from the label side. A few "if" exceptions were required to account for the fact that the "left" side of the X and Y2 axes is the minimum value and the "left" side of the Y axis is the maximum value.
ZedGraph is set up to automatically select appropriate scale minimum, maximum, and step size values based on the range of data values in the curves. Alternatively, you can manually set any or all of the values, and the scale picking logic will attempt to pick the appropriate values for the remaining parameters that are left in the automatic mode. The scale picking logic is based on the assumption that the most humanly palatable step sizes will be even divisors of 10. That is, step sizes should be 1, 2, or 5 times some power of 10. The heart of the scale picking logic is found in the CalcStepSize() method:
protected double CalcStepSize( double range, double targetSteps ) { // Calculate an initial guess at step size double tempStep = range / targetSteps; // Get the magnitude of the step size double mag = Math.Floor( Math.Log10( tempStep ) ); double magPow = Math.Pow( (double) 10.0, mag ); // Calculate most significant digit of the new step size double magMsd = ( (int) (tempStep / magPow + .5) ); // promote the MSD to either 1, 2, or 5 if ( magMsd > 5.0 ) magMsd = 10.0; else if ( magMsd > 2.0 ) magMsd = 5.0; else if ( magMsd > 1.0 ) magMsd = 2.0; return magMsd * magPow; }
The initial guess at the step size is calculated using a default number of steps named targetSteps (this value is defaulted to 7), which is the typical number of major steps you want on an axis. The actual number of steps will usually end up being this number or more. A magnitude of the initial step size is determined using Floor( Log10( stepSize ) ). This magnitude is reduced to a most significant digit, which is then promoted to either 1, 2, or 5 to make the scale an even divisor of 10. In general, I find that this logic is very good at picking scales based on the data range.
Floor( Log10( stepSize ) )
Another aspect of the scale selection is whether or not the scale should be extended to include the zero value. For example, if the scale range is 1 to 10, you would typically want to go ahead and start it at zero. This is accomplished with the ZeroLever default parameter. The ZeroLever is the allowable fraction that the scale range can be extended to include the zero value. This applies below the scale range for positive scales, or above the scale range for negative scale values. As an example, if the ZeroLever is 0.25 and the data range is from 2.0 to 12.0, then the scale would be extended to a range of 0.0 to 12.0 since the zero value lies 20% outside the actual data range (which is within the 25% allowed).
Finally, ZedGraph includes "grace" properties that allow you to include extra space on the scale range before and after the minimum and maximum data values, respectively. The reason for this is to avoid having the minimum and/or maximum data points fall right on the axes. Note that the grace values apply only to the non-ordinal axis types (AxisType.Log, AxisType.Linear, and AxisType.Date). The grace values are controlled by Axis.Scale.MinGrace and Axis.Scale.MaxGrace. These values are expressed as a fraction of the total data range. For example, if MinGrace and MaxGrace are both set to 0.1, then 10% of the data range will be padded before and after the actual data range. For example, if the data values go from 50.0 to 150.0, then the data range is 100.0. 10% of this range is 10.0. Adding this before and after the range gives an effective data range of 40.0 to 160.0. The grace properties will not cause the range to extend across the zero point. That is, if both the min and max data values are zero or greater, then the axis will not be extended to negative values regardless of the grace setting. The default values for MinGrace and MaxGrace are handled by Scale.Default.MinGrace and Scale.Default.MaxGrace, respectively. Both values are set to 0.1 initially.
Each axis now has a property called Type, which can be set to one of these eight values:
ZedGraph includes the capability to handle date-time axes, e.g., the axis labels can be based on an encoded date-time value, displayed in anything from seconds to years. At the heart of the date-time axis is the XDate struct, which captures a time value, and handles conversions to/from a wide range of date-time formats. You're probably wondering why I reinvented the wheel on this, rather than just using the built-in DateTime class (or equivalent). The main reason I made my own class is because an XDate stores its date-time information as a System.Double value. Therefore, XDate values can just be stored in an ordinary array of doubles, just like any other array of data that is passed to ZedGraph. The XDate struct and format are described in detail in the Wiki. If you are using DateTime structs to store your data, you can convert directly to doubles which are compatible with ZedGraph, by using the DateTime.ToOADate() method.
To use a date-time axis in ZedGraph, you need to change to AxisType.Date as follows:
myPane.XAxis.Type = AxisType.Date;
ZedGraph will then assume that the X array double values are actually XDate values. XAxis.Scale.Min and XAxis.Scale.Max will also be XDate values, but the units of XAxis.Scale.MajorStep and XAxis.Scale.MinorStep will depend on the setting of XAxis.Scale.MajorUnit and XAxis.Scale.MinorUnit, respectively. XAxis.Scale.MajorUnit and XAxis.Scale.MinorUnit can be set to one of the following values: DateUnit.Year, DateUnit.Month, DateUnit.Day, DateUnit.Hour, DateUnit.Minute, DateUnit.Second, and DateUnit.Millisecond. Note again that XDate values are actually units of days (actually, days since a reference date). However, if XAxis.Scale.MajorUnit = DateUnit.Year, then a value of 0.25 for XAxis.Scale.MajorStep means that the step size is 1/4th of a year. One more extra property is used for the date-time axes: the Scale.Format. This is a string that defines the format of the major tic labels for the axis. For example, XAxis.Scale.Format = "dd-MMM-yy" would give labels like "12-Dec-95". A wide range of formatting options is available - see the Wiki for details. Note that the formatting is based on DateTimeFormatInfo, which is the same as the DateTime struct.
XAxis.Scale.MajorUnit = DateUnit.Year
XAxis.Scale.Format = "dd-MMM-yy"
Assuming XAxis.Scale.MinAuto, XAxis.Scale.MajorStepAuto, and XAxis.Scale.MaxAuto are all set to true, ZedGraph will attempt to select an axis range that fits the span of the dates. This means that the auto-scaling feature will automatically set the following properties: Axis.Scale.Min, Axis.Scale.Max, Axis.Scale.MajorStep, Axis.Scale.MinorStep, Axis.Scale.MajorUnit, Axis.Scale.MinorUnit, and Axis.Scale.Format.
If you want to try this out, here's the code for an example graph, which has a data point for the first day of each month, for 30 months starting with 1-Jan-1995:
// Build the Chart private void CreateGraph( ZedGraphControl zg1 ) { // Get a reference to the GraphPane GraphPane myPane = zg1.GraphPane; // Set the titles myPane.Title.Text = "My Test Date Graph"; myPane.XAxis.Title.Text = "Date"; myPane.XAxis.Title.Text = "My Y Axis"; // Make up some random data points double x, y; PointPairList list = new PointPairList(); for ( int i=0; i<36; i++ ) { x = (double) new XDate( 1995, 5, i+11 ); y = Math.Sin( (double) i * Math.PI / 15.0 ); list.Add( x, y ); } // Generate a red curve with diamond // symbols, and "My Curve" in the legend CurveItem myCurve = myPane.AddCurve( "My Curve", list, Color.Red, SymbolType.Diamond ); // Set the XAxis to date type myPane.XAxis.Type = AxisType.Date; // Tell ZedGraph to refigure the axes since the data // have changed zg1.AxisChange(); }
The above code generates the following graph:
In this case, ZedGraph selected a major step size of six days, and a minor step size of one day. You can easily adjust the selected format, if desired. For example, if you want to use 1 month for the minor step size, just set myPane.XAxis.Scale.MinorStep = 1.0 and myPane.XAxis.Scale.MinorUnit = DateUnit.Month just before the AxisChange() call. If you change the XAxis.Scale.MajorStep value, you will also have to manually set XAxis.Scale.MajorUnit, XAxis.Scale.MinorUnit, XAxis.Scale.MinorStep, and XAxis.Scale.Format. This is because XAxis.Scale.MajorStepAuto == false since you have chosen to manually select the step size.
myPane.XAxis.Scale.MinorStep = 1.0
myPane.XAxis.Scale.MinorUnit = DateUnit.Month
XAxis.Scale.MajorStepAuto == false
ZedGraph also handles a text axis. This is an axis in which the tic labels are arbitrary, user supplied text strings instead of value labels. Internally, a text axis is handled using ordinal values just like an ordinary axis. In this case, the first major label has a value of 1.0, the second major label has a value of 2.0, etc. It is permissible to use fractional values if you want to place points in-between the labels.
To make a text axis, you set Axis.Type = AxisType.Text. This informs ZedGraph to use the labels supplied by the user in Axis.Scale.TextLabels. The number of labels will determine the axis range. That is, 10 labels means the axis will be ranged from 1.0 to 10.0. Optionally, when you add a curve to ZedGraph, you can just skip any value array that is associated with a text axis. A default array of ordinal values will be generated. For example, if the XAxis is of type Text with 10 labels, you can add a curve, leaving the X array null, and an X array will be generated internally with values from 1.0 to 10.0. The bar chart below shows the usage of the AxisType.Text.
Axis.Type = AxisType.Text
ZedGraph includes bar charting capability for vertical and horizontal bar charts, stacked bar charts, percent stacked bar charts, overlay bar charts, error bar charts, high-low bar charts, open-high-low-close bar charts, and Japanese candlestick bar charts. A bar chart is created similar to a line graph, except that you use GraphPane.AddBar(), GraphPane.AddErrorBar(), or GraphPane.AddHiLowBar() to create the bar instance. It is possible to mix bars, lines, and symbols on the same graph, by simply adding the different types.
Bars can be made horizontal or vertical, by setting the "base" axis to the X or Y axis. Under the ZedGraph terminology, the "base" axis determines the bar position, and the "value" axis determines the height of the bar.
Typically, bar charts would be created with XAxis.Type = AxisType.Text or XAxis.Type = AxisType.Ordinal (both types use ordinal values), such that the bars are drawn at integral values along the "base" axis, starting with 1 (e.g., the first bar cluster is at 1.0, the second is at 2.0, etc.). However, the ordinal axis type is not a requirement for bar charts. It is possible to create a bar chart that is not evenly spaced, by providing X values and using AxisType.Linear (in this case, you may need to use the GraphPane.ClusterScaleWidth property to tell ZedGraph how wide the bars should be. See this wiki page for details). For bar charts, the tic marks are typically between the bar clusters, which can be accomplished with the Axis.MajorTic.IsBetweenLabels property. However, this property is only applicable for AxisType.Text axes.
XAxis.Type = AxisType.Text
XAxis.Type = AxisType.Ordinal
ZedGraph actually has six distinct bar types, any of which can be horizontal or vertical:
Other "bar-like" types are also available:
The following is an example of a JapaneseCandleStickItem chart, used to show High-Low-Open-Close data for the stock market:
The orientation (horizontal or vertical) and the size of the BarItem bars are determined globally by GraphPane.BarSettings.Base and other GraphPane.BarSettings properties. Therefore, all BarItem bars will have similar properties, and the size of the bars is scaled automatically to fill the available space. In contrast, the size of ErrorBarItem bars and HiLowBarItem bars are controlled by individual properties for each bar item, e.g., ErrorBarItem.Bar.Size. These bar types are actually similar to symbols, since the bar width is specified in points (1/72 inch). A single plot can have a variety of different ErrorBarItems and HiLowBarItems with different sizes.
Two properties are included in the GraphPane class to control the gaps between BarItem bars; GraphPane.BarSettings.MinBarGap (default = 0.2) is the minimum size of the gap between each bar within a bar cluster (multiple bars that share the same X value), and GraphPane.BarSettings.MinClusterGap (default = 1.0) is the minimum size of the gap between the bar clusters. Both of these parameters are expressed as a fraction of the individual bar size, i.e., a value of 1.0 would make the gap the same size as the bars. Note that these properties apply only to BarItem bars (not ErrorBarItem or HiLowBarItem bars). A new Bar class has been added to the BarItem class to control the properties of the bars. This Bar class has properties for Fill, FrameColor, FrameWidth, and IsFramed. The following example generates a simple bar chart:
// Build the Chart private void CreateGraph( ZedGraphControl zg1 ) { // get a reference to the GraphPane GraphPane myPane = zg1.GraphPane; // Set the Titles myPane.Title.Text = "My Test Bar Graph"; myPane.XAxis.Title.Text = "Label"; myPane.YAxis.Title.Text = "My Y Axis"; // Make up some random data points string[] labels = { "Panther", "Lion", "Cheetah", "Cougar", "Tiger", "Leopard" }; double[] y = { 100, 115, 75, 22, 98, 40 }; double[] y2 = { 90, 100, 95, 35, 80, 35 }; double[] y3 = { 80, 110, 65, 15, 54, 67 }; double[] y4 = { 120, 125, 100, 40, 105, 75 }; // Generate a red bar with "Curve 1" in the legend BarItem myBar = myPane.AddBar( "Curve 1", null, y, Color.Red ); myBar.Bar.Fill = new Fill( Color.Red, Color.White, Color.Red ); // Generate a blue bar with "Curve 2" in the legend myBar = myPane.AddBar( "Curve 2", null, y2, Color.Blue ); myBar.Bar.Fill = new Fill( Color.Blue, Color.White, Color.Blue ); // Generate a green bar with "Curve 3" in the legend myBar = myPane.AddBar( "Curve 3", null, y3, Color.Green ); myBar.Bar.Fill = new Fill( Color.Green, Color.White, Color.Green ); // Generate a black line with "Curve 4" in the legend LineItem myCurve = myPane.AddCurve( "Curve 4", null, y4, Color.Black, SymbolType.Circle ); myCurve.Line.Fill = new Fill( Color.White, Color.LightSkyBlue, -45F ); // Fix up the curve attributes a little myCurve.Symbol.Size = 8.0F; myCurve.Symbol.Fill = new Fill( Color.White ); myCurve.Line.Width = 2.0F; // Draw the X tics between the labels instead of // at the labels myPane.XAxis.MajorTic.IsBetweenLabels = true; // Set the XAxis labels myPane.XAxis.Scale.TextLabels = labels; // Set the XAxis to Text type myPane.XAxis.Type = AxisType.Text; // Fill the Axis and Pane backgrounds myPane.Chart.Fill = new Fill( Color.White, Color.FromArgb( 255, 255, 166), 90F ); myPane.Fill = new Fill( Color.FromArgb( 250, 250, 255) ); // Tell ZedGraph to refigure the // axes since the data have changed zg1.AxisChange(); }
ZedGraph can draw BarItem bar charts in a variety of types according to the GraphPane.BarSettings.Type property. This can be one of the following values:
The following samples show horizontal and stacked bar types:
Pie charts are created in the normal fashion using the GraphPane.AddPieSlice(), which returns a PieItem. One PieItem is added for each slice of the pie. Note that, unlike the other CurveItem - derived classes, the PieItem does not use the PointPairList to store the data value. Since the pie has only a single data value, it is stored in PieItem.PieValue. The pie charts support text labels, a legend, color fills, etc. in the typical ZedGraph fashion.
Although it is technically possible to combine pie charts with line graphs on the same GraphPane, it is not recommended. If a particular GraphPane contains only PieItem objects, then the AxisChange() method will automatically make the axes invisible by setting the Axis.IsVisible property to false.
The following is an example of a ZedGraph pie chart:
The MasterPane is designed to help facilitate the handling of multiple GraphPane objects on a page. This is done by maintaining a list of GraphPane objects, and providing utility functions for layout, rendering, mouse point location, etc. See the ZedGraphWiki for details on the MasterPane class. The following is an example of a chart based on the MasterPane class:
The ZedGraphControl class now provides some interactive functionality for zooming and panning. To zoom, left click inside the AxisRect area, and drag out a new rectangle to indicate the scale region into which to zoom. To pan, either click with the middle mouse button or hold down the shift key, and left click to drag the graph around (the zoom/pan key combinations are user-modifiable as well). You can also add scrollbars to the control with IsShowHScrollBar and IsShowVScrollBar. The mouse-wheel can also be used for zooming. There is also a context menu that allows you to un-zoom and un-pan to prior states, to restore the scale to full auto mode, to show point value tool tips, and to copy the graph (bitmap form) to the clipboard. Event options are provided to allow for customization of pan, zoom, point values, etc.
The Fill class is an important addition to ZedGraph, so it deserves a special mention. This class handles solid, linear gradient, and texture fills for the pane background, the axis background, the legend background, all text backgrounds, the symbol fill, and for filling the area under a line. Each of these classes will have one or more Fill classes to control the fill properties (e.g., CurveItem.Line.Fill controls the filling of the area under the curve). The Fill class has a number of constructors to make it flexible and easy to use:
Fill( Color )
Fill( Color, Color )
Fill( Color, Color, float angle )
Fill( Image, WrapMode )
Fill( Brush )
Fill( Brush, bool isScaled )
Fill( Brush, AlignH, AlignV )
Internally, the Fill class keeps a FillType enumeration (the Type property) to determine what type of fill is used, as follows:
The following graph is an example of FillType.GradientByZ usage, in which seemingly scattered data gains visual coherency using the color attribute:
The following shows an example of using an image to fill in the bars of a bar chart:
The graphic items in the display are contained in two lists; GraphPane.CurveList and GraphPane.GraphObjList. CurveList contains all of the curves, including bars, lines, etc. GraphObjList contains text items, images, shapes, arrows, etc. In both lists, the Z-Order is controlled by the order of the objects in the list; the first objects in the list appear in front of the later objects in the list. You can modify the order of any object relative to other objects in the same collection (list), with the Move() method in the collection class. Further, the GraphObj class has a ZOrder property that controls the depth of each individual GraphObj relative to other, non-GraphObj objects. The ZOrder is an enumeration type with the following values:
ZedGraph is being used as a class library in interactive parent applications that need information about the graph. The following are some utility methods that are worth mentioning (these are documented in the ZedGraph.chm doc file):
GraphPane.Chart.Rect = yourRect
I would like to thank all those who have tested the code, reported issues, and contributed code to the ZedGraph project. I would especially like to acknowledge the contributions of the volunteer developers who made ZedGraph possible: Jerry R. Vos, Bob Kaye, Darren Martz, and Benjamin Mayrargue.
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
General News Suggestion Question Bug Answer Joke Praise Rant Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.


text:
We ships worldwide to nearly every country across the global, we employ the services of major, trusted international carriers to ensure your package arrives to your destination fast and securely.We also offer free flat rate shipping on all our products to most destinations.
Order Successful
After you have successfully placed your order you will receive email confirmation from us. If you have any requests for your order, kindly let us know as soon as possible before your item enters the processing stage.
Note: In orders with more than one item, the processing time will be based on the item with the longest processing time.
We will carry out strict quality controls on your items and ensure they are properly packed before preparing them for shipment. We are happy to announce that now most orders can be shipped out within 24 hours. Kindly note a small quantity of orders may still need between 3-5 business days depending on stock availability.
Please note that the processing time is not included in the shipping time. The total time it will take to receive your order is the processing time + the shipping time.If you have any issues with your order, you can submit a ticket to our Support Center for further assistance. Our dedicated CS team will contact you within 24 hours.
Our partners with major international shipping companies to offer different methods.
You can choose your preferred shipping method on the Order Information page during the checkout process.
Note: Shipping times may be affected during public holidays as manufacturers and couriers will limit their operations during these times. Though this is unfortunately out of our control, we will try our best to improve on this issue.
Note: For tracking numbers, it may take a few days before they become active on the tracking website. If the information is not available please try again later. Please rest assured that the estimated shipping time is valid regardless of the tracking site updates.
We high recommend that customers purchase a tracking number and shipping insurance during the check out for peace of mind when waiting for their package.
Kindly note that all packages are shipped from different Warehouses. Our items are shipping duty unpaid and therefore import tax may occur depending on your country's Customs and shipping method. You may check with your local Customs Office for more information.
Contact Us
If any issue during the shipping time or after received the item, please feel free to Contact us, our customer service representatives will offer you a satisfying solution.

subset: commoncrawl


text:
65 MCMLXV Jaguar Print Dog Zip Hoodie
Let your dog be adventurous without compromising comfort and mobility with the 65 MCMLXV Jaguar Print Dog zip-up hoodie. Made from a soft and durable fabric. The smooth fabric will make this your dog's most comfy zip-up hoodie ever! It also comes with a small opening on the upper back for dog harness users. And a sturdy velcro pocket located on the back to store some treats. The front zipper closure also provides easy fitting for your dog.
• 95% polyester, 5% spandex
• Two-way stretch fabric
• Soft handfee
• Nylon zipper front closure
• Sturdy velcro pocket on the back
• Small opening on the back for dog harness
• High definition printing colours
• Design will never peel, flake or crack
Because it's handmade for you, these hoodies require 4-8 business days before they are shipped. Orders placed before midnight will be included in the following day's batch for manufacturing.
Frequently Asked Questions:
Which measurement should I pay extra attention to?
The most important measurement is the chest, as this will determine how loose or tight the zip-up hoodie will be. Make sure you're as accurate as possible.
How does the sizing chart work?
The chart shows the exact measurements of our zip-up hoodies. For comfort leave about 1"/2.5cm for comfort.
What if my dog is between sizes?
We always recommend to order the bigger size. Some more room for movement is much more comfortable for your dog.
My dog has a lot of fur. Should I include that in my measurement as well?
Yes, definitely. Fluffier dog breeds should have their fur compressed slightly but comfortably when measuring.
Are the drawstrings on the hood just for display or functional?
The drawstrings are functional. They can be used to tighten the hood if needed.


text:
The past(the one before the recent one) weekend was a long one, not long as in l---o---o--o-ng but merely long. A friend decided to come and stay with us for 2 of the three days. No one asked, they simply notified and rang the bell Saturday night with two kids, a wife, two pillows and several other paraphernalia. Well we have known them for years and such privileges are acquired if you know one for long.
I was a bit weary of the situation. Given my recent stranger anxiety along with baby A's I wasn't sure how things would pan out. That they had a 3 month old who according to the parents was colicky and could wreak havoc by crying(again according to parents) didn't soothe my tense nerves.
Things turned out very well though and everyone had a blast. Sunday was well spent at the beach. It was a bit cold but nothing to keep the kids away. Big Sis S, her friend M, her two pseudo cousin brothers A&A and a pseudo elder sis G had loads of fun at the beach and then later on the rides at the boardwalk.
Baby A doesn't like strangers and that means any adult outside the family and her nanny. She also doesn't like to be bound in any static object like highchair, bouncer, static strollers etc. And she doesn't keep her dislike to herself, she protests loudly and monotonously. So she had to be carried while the older kids played on the beach or on the rides. She is a petite child, very much so and carrying her is easy, so many friends aka strangers volunteered but she pouted and her eyes wailed up at gestures of such love and intimacy. She clung to her not so petite Mom and generally had a mighty good time watching everything from a safe perch.
Back home she was intrigued by the 3 month old. At every opportunity she would scoot up to his bouncer, stand up and try to poke his head, face whatever. She also tried to take away the smaller one's pacifier several times. The 3 month old didn't really cry all that much or maybe I have just got used to such stuff.
Big Sis S had a great time overall with her friend M(the visiting couple's elder daughter) who is same age and that brings me to a niggling doubt which I will throw at you as a question. What do you do when you have house guests and your parenting principle does not match theirs ? The husband is pretty non-conformant and dishes out same sermons/scoldings/rules to all kids. Fortunately since most of these people are close friends no one minds. I am a bit hesitant though to do the same. What about you ?
Since Saturday night we all were invited to a friend's party and Sunday lunch was outside, I had decided to serve a homecooked meal on Sunday night. I knew I would be dead tired and maybe even crabby by the time we came back home Sunday evening. So I had decided to do a pualo and a gravy, a part of which could be cooked the day before. D would be grilling hot dogs and corn to supplement the meal.
What I made was a Chicken Kofta Curry (Chicken meatballs in a gravy) and then a Kofta Pulao (a meatball pulao) with some Raita to jazz it up. Both the curry and the pulao are a major hit with family as well as friends. And so even though we were almost full with the continuous snacking and grilling we sat down for a late dinner at 11 in night to devour these delicacies.
This particular dish serves 3 purpose at 3 stages of making.
- When you make the Chicken masala balls, you can fry them and serve as appetizers.
- You then make a gravy (the Kofta Curry) with the same balls, it turns out as a deliciously finger-licking side dish.Don't skip the frying the onion and then blending routine, it adds to the taste as does the fragrant Kasoori Methi
- Finally you use some of that gravy and the kofta to make a Kofta Pulao which serves as your entree. Whip up a raita and you have a gorgeous spread
The Kofta Pulao recipe comes in the next post in two days time
Read more...
Make Chicken Masala Balls(better known as Koftas)
The following quantity makes about 40-50 meatballs. All of them will NOT be used in the gravy.
To make Chicken masala balls I follow this recipe mostly. Roughly I will repeat here.
Dry roast 5-6 dry red chillis (adjust according to your choice) + 4 tbsp Corriander seeds + 1&1/2 tbsp Cumin Seeds + 1" stick of cinnamon + 5 cardamom + 5 clove + 10-20 cashewnuts
Cool and grind to a fine powder
Wet grind to a fine paste 1 medium onion + 5-6 cloves of garlic + 3" piece of ginger + some chopped corriander leaves + 8 indian green chili(go with few if your hot tolerance is low).
Note: Sometimes if in a hurry, I will make a wet paste with just 2 tsp Garlic Paste + 2 tsp ginger paste + 2 tsp corriander paste
Marinade 2-3 lb(rough estimate) of minced chicken(chicken keema) with all this
Dry masala,
Wet Masala,
2 tbsp of yogurt
and salt for 30 mins to 2-3 hrs
Grease your palm with little oil and then make small amla or tomatiilo sized balls
Fry some of these balls and serve as an appetizer. The rest will be used in the gravy. To use in gravy you NEED NOT fry the balls.
Make Kofta Curry
I used about 24-28 chicken masala balls to make this curry
Heat Oil in a deep bottomed frying pan/Kadhai
Fry 3 medium onion chopped + 6-8 cloves of garlic + 2" ginger peeled and coarsely chopped
When the onion is lightly browned add 2 medium red tomato coarsely chopped and fry till the tomato is all mushed up and there is no raw smell. Note: I add a teeny tiny spoon of sugar to help in browning onion
Alternate Idea : Boil the raw onions. Cool and grind to paste. Make a separate paste of ginger + garlic+green chili. Make a puree of the tomatoes. You have to spend a little more time to fry the onion paste in this case.
Cool the above and blend to a paste. Keep aside
Heat some more oil in the same frying pan. This time go with less oil
Add the prepared onion+ ginger+garlic+tomato paste and fry till oil separates from the masala
In a small bowl make a paste of 3 tbsp Yogurt + 2 tsp of Cumin Powder + 1 heaped tsp of Biryani masala + 1-2 tsp of Red Chili Powder + little(1/4tsp) turmeric powder. Note: if you don't have your home made Biryani masala use Garam Masala
Reduce heat and add this masala paste to the Kadhai/Frying pan
Add 2 tsp of Kasoori Methi (dried Fenugreek leaves)
At low heat saute for couple of minutes till you see the masala is cooked and the oil seeping out from the sides
Add 1 cup Milk + 1 cup water. Note: I added 2% milk, you can add whole milk but this tastes as good
Add salt and mix everything well
Increase the heat to medium and let the gravy come to a boil
If you have NOT fried the chicken balls, add them(the raw spiced meat balls) to the gravy now.
If you did not pay attention and have fried the chicken balls you can add them to the gravy at the second last step.
Cover and cook till the balls are done. The balls will cook pretty quickly in the steam and will be done in 5-7 minutes.
Once the balls are cooked, remove them with a slotted spoon and keep aside. You don't want to over cook them
Reduce the gravy till it is thicker to a consistency you would like
Check for seasonings, add the chicken balls to the gravy, mix everything well and garnish with finely chopped corriander leaves.
The delicious Kofta Curry is ready to be served with Naan, Roti or a Pulao...
Note: If you are feeling extremely lazy you can get Chicken Balls from Costco or wherever and use that to make this curry


text:
Tell us about what you're looking for and we'll help quickly connect
you with up to five quotes for free.
Confused by all of the different options out there for Office Coffee Service? OfficeCoffeeServiceHQ.com wants to help. We take the stress out of finding the ideal coffee service for your business or organization. We provide a free service that allows you to get price quotes from office coffee service providers and suppliers in Huron SD.


text:
Product Description
C6EF Quality and Quantity Assured Single-phase Air Compressor
Our company offers variety of products which can meet your multifarious demands. We adhere to the management principles of "quality first, customer first and credit-based" since the establishment of the company and always do our best to satisfy potential needs of our customers. Our company is sincerely willing to cooperate with enterprises from all over the world in order to realize a CZPT situation since the trend of economic globalization has developed with anirresistible force.
How to Repair and Maintain an Air Compressor
A compressor is a device used to move air from 1 place to another. Air enters the air compressor through the intake valve. Inside the compressor, the vanes on the inner rotor rotate within an eccentric cavity. The self-adjusting length arm divides the space into multiple cavities of different sizes. As the rotor rotates, air fills the cavity. As air flows around the cavity, it builds pressure and is squeezed out of the compressor output.
Positive displacement
Positive displacement air compressors use reciprocating pistons to compress air. Gas is drawn in during the suction stroke and compressed by moving the piston in the opposite direction. It then discharges the compressed air by moving it in the opposite direction. This type of air compressor is most commonly found in automobiles, refrigerators, and other applications that require high pressure. However, it is not as efficient as a centrifugal compressor.
Most modern air compressors use positive displacement. Positive displacement models capture a volume of air in the compression chamber and distribute it when the pump is operating at maximum capacity. They are more economical than their negative displacement counterparts. Reciprocating screw air compressors are the most common positive displacement compressors. The reciprocating screw air compressor adopts a water jacket around the cylinder and is often used in processes such as oil drilling.
A bicycle pump is an example of positive displacement compression. Air is drawn into the cylinder and compressed by the moving piston. A piston compressor works on the same principle, but it uses a rotating crankshaft or connecting rod to complete the movement of the pistons. There are 2 types of positive displacement compressors: single-acting and double-acting. Both types work on the same principle, both are positive displacement compressors. The difference between the 2 types is the pressure ratio.
In air compression, positive displacement compression reduces the volume of the fluid and reduces its viscosity. This results in higher pressure ratios and is used in centrifugal, axial, and scroll compressors. Positive displacement is a common feature of most air compressors. Positive displacement compressors offer the same benefits and are more energy-efficient when applied to oil-free and gas applications. This type of compression is usually the best choice for low-pressure applications.
oil free
If you're looking for an air compressor for your business, consider an oil-free air compressor. These models offer cleaner, quieter operation than traditional air compressors and require less maintenance. They also meet ISO Class 0 or Class 1 air purity requirements. Oil-free air compressors are also quieter, with fewer moving parts and less noise. These advantages make oil-free air compressors an ideal solution for many commercial applications.
Air purity is critical in many industries. Even the tiniest drop of oil can damage production equipment or damage products. The best way to find an oil-free air compressor for your business is to consider the process and end product. As air quality improves, more and more businesses are turning to oil-free compressors. Some of the advantages and disadvantages of these air compressors are:
When choosing an oil-free air compressor, it is important to understand the terminology used in the industry. Knowing these terms will make it easier for you to choose the right compressor for your needs. ACTFM, or actual cubic feet per minute, is an industry term for measuring the amount of air pumped in 1 minute under rated conditions. Although a simple number, it can be very useful in determining which type of air compressor is best for your application.
The ISO 8573-1 international standard defines air quality and provides air purity classifications. The strictest classification is air purity class 0. Many manufacturers claim that oil-free air compressors meet this standard. However, a class 0 oil-free air compressor does not necessarily mean that the air is free of contaminants. In fact, Class 0 is the benchmark for air purity. While zero air quality is the highest level, that doesn't mean it's completely oil-free.
double acting
A double-acting air compressor is a device that uses compressed air to generate electricity. Its working principle is based on piston and connecting rod. The connecting rod connects the crankshaft to the piston through pins and caps. The piston moves as the piston moves. Rods are usually made of forged carbon steel. In terms of service and maintenance, double-acting compressors require regular vise maintenance and proper cleaning.
The displacement of the compressor is a measure of the displacement that the piston can produce in a certain period of time. Displacement is usually expressed in actual cubic feet per minute. The exact calculation depends on the type of cylinder and the configuration of the compressor. Single-acting cylinders can have head-end or crank-end displacement, both of which can be measured using the displacement equation. A double-acting air compressor will use this equation. 4 and 6 calculate the displacement.
Double-acting air compressors have multiple cylinders and are made of cast iron. They are water-cooled and have a mechanical connection between the piston and connecting rod. A double-acting compressor compresses air twice per revolution of the motor. One cylinder moves up, while the other cylinder moves down. The piston moves down, allowing air to enter through valve #1. During the operation of the compressor, the temperature of the air and gas increases.
Double-acting air compressors typically have high pressure and are considered workhorses. Double-acting compressors also feature intercooling and double compression. As a result, these machines tend to last longer than single-acting compressors. Its low speed and dual compression make it a workhorse in the compressor industry. Double-acting air compressors are workhorses and versatile devices.
fuel tank pressure switch
You can adjust the pressure in the air compressor tank by adjusting the differential pressure. You can turn the mainspring clockwise or counterclockwise to increase or decrease the pressure. This valve will open when the pressure is low enough to start the compressor. If the pressure is too low, the valve should be closed. The cut-in and cut-out pressures should be set to appropriate values. After adjusting the tank pressure, check the hysteresis of the tank pressure switch and set the desired shutoff pressure.
If the pressure in the tank falls below the cut-in level, the tank pressure switch must be replaced. You can test the switch with a multimeter. Make sure the switch is not damaged. If you can't find the switch, you can look at the other sections. If you find any damaged or missing parts, you should replace them. Otherwise, it may be time to check the tank pressure switch. You may need to disassemble the compressor and remove the switch.
The fuel tank pressure switch is an important part of the air compressor. It keeps you informed of the amount of air delivered by the compressor. If your tank or tank is damaged, your readings will be wrong. If the pressure switch is damaged, it will not function properly and result in incorrect readings. Fortunately, there are some easy ways to fix this. To prevent this from happening, keep the tank pressure switch in good condition.
When the air pressure in the tank drops to the cut-in pressure setting, the switch allows power to flow through it. This will start the motor and pump of the air compressor. Then, if the pressure in the tank rises above the cut-off level, the switch will trip and stop the compressor. This will prevent it from being over-pressurized. Power flow will continue to flow to the motor. Depending on your compressor model, you can change the cut-in and cut-out pressures as needed.
energy source
The power supply of the air compressor is very important. Most air compressors run on 12 VDC, which is ideal for automotive use. Alternatively, you can buy a switching power supply for around $20. No matter which power supply you choose, you must ensure that it can support the maximum current of the compressor. You can find power supplies in all sizes, from quarter-horsepower to five-horsepower.
The voltage required for a three-phase air compressor will vary. Three-phase air compressors require 3 separate power cords and a three-phase electrical service panel. This is because a standard 120/240-volt electrical service panel is not sufficient to power a three-phase compressor. Additionally, three-phase compressors require 3 separate isolated wires for the engine and motor circuits. Three-phase compressors do not require a neutral wire.


text:
Welcome to The Night Before! Printable wedding rehearsal sign that you edit yourself with Corjl! Choose from several fonts (not all seen in the listing images) and customize the background color!
Copy and paste this URL into your web browser to "Try before you buy":
►Edit with a computer using Google Chrome for best results. If using a mobile device, edit the design by using a browser in "desktop mode"
• This is an editable file that you will edit yourself using Corjl. See below for info.
• High quality 16x20" digital printable files (JPG & PDF options available). 16x20" can be printed as 16x20", 8x10" & 4x5".
• DIGITAL PRINTABLE FILES ONLY! No physical prints will be sent.
• Create ONE custom digital file per order.
• Not all aspects of the design can be edited. On this design most of the text is editable, with several different fonts to choose from. The text "the Night Before" cannot be altered. Customize the background color. The rest of the design will remain as seen in the previews and cannot be changed. Please try it out with the demo link (see above) to see just how easy it is to edit, as well as what exactly is editable.
• If you'd like to have the shop do the editing for you, please see this listing: https://www.etsy.com/listing/693215392
• If you'd like to add your own images or graphics to this design, please see this listing: https://www.etsy.com/listing/726296908
• Edit your items at Corjl.com right after purchasing.
- You'll have access to your item almost immediately after your order processes.
- No need to download any software! You can do any available customization right in your browser.
- Personalize using your computer, or make basic edits using your phone or mobile device (Not all features are available on mobile devices - use a browser for best results)
- Approve your proof immediately after personalizing, then download the file and print.
Click here for useful videos on editing your file: https://www.youtube.com/playlist?list=PLOjxwHNYIvoOYbGtyVtZnIEUsZsFda8Lt
• DIY EDITABLE THE NIGHT BEFORE digital printable files: https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=The+Night+Before+Corjl
• THE NIGHT BEFORE digital printable files: https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=The+Night+Before
• REHEARSAL DINNER digital printable files: https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=REHEARSAL+DINNER
• TOMORROW digital printable files: https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=tomorrow
• DIY EDITABLE digital printable files: https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=Corjl
► Do not log in with an Apple ID or use Apple Pay. If you do, you may not be able to access your editable link.
► You will be able to edit and save your design until you mark "Approve Proof". Once marked approved, you will be able to download (and print) as many times as needed but will not be able to make any further changes to the design. If you'd like an additional design or to make changes, you will need to make an additional purchase.
► ALL templates are for PERSONAL USE ONLY and may not be used for commercial use, resold in any format, distributed, or shared.
► All fonts seen throughout this shop are not necessarily available with Corjl.
► Due to the nature of instant download digital images, all sales are final. No refunds and/or exchanges will be provided.
Digital printable files – no physical prints.
Thank you so much for viewing my listing! Please message me if you have any questions – I am happy to help! By purchasing this listing, you are agreeing to this shop's policies & terms of use.
Thank you for visiting {PRINTS} by MA Design!
© {PRINTS} by MA Design - All Rights Reserved.
Your files will be available to download once payment is confirmed.
But please contact me if you have any problems with your order.
Information I Collect
To fulfill your order, you must provide me with certain information (which you authorized Etsy to provide to me), such as your name, email address, postal address, payment information, and the details of the product that you're ordering. You may also choose to provide me with additional personal information (for a custom order, for example), if you contact me directly.
Why I Need Your Information and How I Use It
I rely on a number of legal bases to collect, use, and share your information, including:
• as needed to provide my services, such as when I use your information to fulfill your order, to settle disputes, or to provide customer support;
• if necessary to comply with a legal obligation or court order or in connection with a legal claim, such as retaining information about your purchases if required by tax law; and
• as necessary for the purpose of my legitimate interests, if those legitimate interests are not overridden by your rights or interests, such as 1) providing and improving my services. I use your information to provide the services you requested and in my legitimate interest to improve my services; and 2) Compliance with the Etsy Seller Policy and Terms of Use. I use your information as necessary to comply with my obligations under the Etsy Seller Policy and Terms of Use.
Information Sharing and Disclosure
Information about my customers is important to my business. I share your personal information for very limited reasons and in limited circumstances, as follows:
• Etsy. I share information with Etsy as necessary to provide you my services and comply with my obligations under both the Etsy Seller Policy and Etsy Terms of Use.
• Service providers. I engage certain trusted third parties to perform functions and provide services to my shop, such as a secure file transfer services (Google Drive, for example). I will use your email address with these third parties, but only to the extent necessary to perform these services.
• Business transfers. If I sell or merge my business, I may disclose your information as part of that transaction, only to the extent permitted by law.
• Compliance with laws. I may collect, use, retain, and share your information if I have a good faith belief that it is reasonably necessary to: (a) respond to legal process or to government requests; (b) enforce my agreements, terms and policies; (c) prevent, investigate, and address fraud and other illegal activity, security, or technical issues; or (d) protect the rights, property, and safety of my customers, or others.
Data Retention
I retain your personal information only for as long as necessary to provide you with my services and as described in my Privacy Policy. However, I may also be required to retain this information to comply with my legal and regulatory obligations, to resolve disputes, and to enforce my agreements. I generally keep your data for the following time period: 2 calendar years.
Transfers of Personal Information Outside the EU
I may store and process your information through third-party hosting services in the US and other jurisdictions. As a result, I may transfer your personal information to a jurisdiction with different data protection and government surveillance laws than your jurisdiction. If I am deemed to transfer information about you outside of the EU, I rely on Privacy Shield as the legal basis for the transfer, as Google Cloud is Privacy Shield certified.
Your Rights
If you reside in certain territories, including the EU, you have a number of rights in relation to your personal information. While some of these rights apply generally, certain rights apply only in certain limited cases. I describe these rights below:
• Access. You may have the right to access and receive a copy of the personal information I hold about you by contacting me using the contact information below.
• Change, restrict, delete. You may also have rights to change, restrict my use of, or delete your personal information. Absent exceptional circumstances (like where I am required to store data for legal reasons) I will generally delete your personal information upon request.
• Object. You can object to (i) my processing of some of your information based on my legitimate interests and (ii) receiving marketing messages from me after providing your express consent to receive them. In such cases, I will delete your personal information unless I have compelling and legitimate grounds to continue using that information or if it is needed for legal reasons.
• Complain. If you reside in the EU and wish to raise a concern about my use of your information (and without prejudice to any other rights you may have), you have the right to do so with your local data protection authority.
How to Contact Me
For purposes of EU data protection law, I, Mary Anne A., am the data controller of your personal information. If you have any questions or concerns, you may contact me at email@example.com
► CUSTOM ORDER FULFILLMENT HOURS: M-F 9-11am EST
During off-hours messages may not be replied to as quickly
► TURN-AROUND TIME changes often. Please see Shop Announcement for the most current processing time.
► CLOSED WEEKENDS & US NATIONAL HOLIDAYS including:
New Year's Day
Martin Luther King Day
Presidents' Day
Good Friday
Memorial Day
Independence Day
Labor Day
Black Friday
Christmas Eve
Christmas Day
New Year's Eve
► RUSH ORDER OPTIONS: https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=Rush
>>> Read all info PRIOR to purchase. A confirmation from the shop is required.
A digital printable file is a file (JPG or PDF) you can print yourself or have printed. This shop does not sell any physical prints.
Digital printable files = print at your convenience, as many times as you want! No shipping fees, or worrying about anything getting damaged/lost in the mail. Choose where you want to have it printed (very cost effective) - print at a one-hour photo lab & you could potentially have it in your hands within hours of purchasing it! Print any size within the same aspect ratio, on the material you want (paper, poster board, canvas, metal, etc). Also, create photo gifts with your digital prints, add them to photo books, share on social media, etc!
Print your digital file as many times as you want! Print different sizes (same aspect ratio), add to photo books, create photo gifts, share on social media (#PRINTSbyMAdesign), etc!
►For info on printing your digital file, please see the ABOUT section of my shop: https://www.etsy.com/shop/PRINTSbyMAdesign/about
--- All files are high resolution/high quality. If yours is blurry or you receive a warning message about low resolution, please see my Printing Info.
►Digital files are for personal use only. You are welcome to print it for yourself or as a gift, but you CAN NOT resell it in part or whole - either in a digital or printed format.
Prints are High Resolution & High Quality. If you receive a LOW RESOLUTION warning, please see below:
• CUSTOM PRINTS: make sure you DOWNLOAD the file - don't simply save the preview (the download button will be at the top center of the screen after you click the name of your file).
• My digital prints are high resolution & larger than they need to be in order to print high quality. If your print appears blurry, please go back and make sure you downloaded it correctly.
• If you're given a choice of upload speeds when uploading, NEVER CHOOSE THE FAST OPTION! This will reduce the quality of the print since they are very large. By default, the fast upload option is often selected, so make sure you choose the option for large prints.
Sales run often so keep a look out! Find me on Facebook to catch special promotions and deeper discounts! facebook.com/MAonEtsy
Check out the SHOP ANNOUNCEMENT fur the current promotion!
PINTEREST DISCOUNT: Receive 10% off of a specific listing when you pin it on Pinterest! Contact the shop for further details or if you have any questions.
Please message the shop prior to purchase with any questions. All sales are final (no refunds/cancellations/exchanges).
►NON-EDITABLE: sent from Etsy via the email address linked to your account (no other address). No changes can/will be made, as you receive exactly what you see in the listing. Access your download link under "Purchases" https://www.etsy.com/your/purchases
►EDITABLE: Edited with Corjl (marked with the Corjl logo on the listing photo). An email is sent from Corjl with a link to access your item. You can then edit, save, approve, download, & print. You can download & print as many times as needed but cannot make changes to a completed design. Your access link will expire in 90 days. The shop will not do any editing to an "Edit Yourself" design. https://www.etsy.com/shop/PRINTSbyMAdesign/items?search_query=Corjl
• Proofs must be requested on any custom order that the shop edits.
• Proofs are only sent through Etsy Messages after ALL info is received. The final high-res digital file will be emailed ASAP once the proof is approved.
• Proofing includes minor changes only (es: spelling error). Proofing does NOT include major changes, including, but not limited to: resizing, creating a completely new print, changing any text (not pertaining to the customer's custom info), rearranging or reworking the design, etc.
• 2 free proofs per custom order. Additional revisions can be purchased here: https://www.etsy.com/listing/228710896
• Proofs are sent after payment clears
• Proofs are provided for custom orders (edited by the shop) only, not Corjl listings
When a custom order is completed, a "shipping notification" is sent with a download link (via Google Drive). This notification is to alert you that your order has been completed & emailed. If you have not received the email with your download link, yet you know it was sent, please check your spam folder. Completed orders can be accessed under "Purchases": https://www.etsy.com/your/purchases
JPGs and PDFs are file types. Some print labs only print one type or the other -- most use JPGs, which is why this shop sends JPGs. If you need a PDF, it must be requested when the order is placed. If you need to have a bleed (your print lab will tell you this), this must be requested at the time of the sale.
Per Etsy's Terms of Use, customers are responsible for reading all Item Descriptions & Shop Policies prior to purchase: https://www.etsy.com/legal/buyers/?ref=list#purchasing
Exchanges *MAY* be possible for CUSTOM orders only, and will be determined on a case-by-case basis.
Custom orders are deleted from my computer 14 days after they are sent to the customer (to make room for new orders). If an order needs to be edited after 14 days, a new purchase must be made since the design will need to be completely redone. All files are permanently deleted from Google Drive 4 months after they are sent to the customer
Please contact this shop via Etsy Messages (formerly known as "Etsy Conversations") only.
DO NOT EMAIL THE SHOP - Email is not reliable since messages often go to the Spam Folder. Please use Etsy Messages only!
No communication will ever be done via phone -- not text or voice.
------> UNDER NO CIRCUMSTANCES will this shop do any cancellations, refunds, or modifications to previous orders. This is including, but not limited to, coronavirus (COVID-19). Please see the Shop Policies for more information.
Oct 13, 2019


text:
Privacy Statement
We are committed to safeguarding your privacy. Please read the following policy to understand how your personal information will be treated as you use our services. This policy is provided to you as required by the federal Gramm-Leach-Bliley Act (15 U.S.C. §� 6801 et seq.) and the appropriate regulations and guidelines thereunder.
The Security We Use to Protect Your Information
We use SSL (Secure Sockets Layer) technology to protect all data transmitted between browsers and our servers. In order to use the site, users are required to be running an SSL-capable browser.
What Information We Collect From You
We collect various types of personal information about you during the normal course of offering and providing real estate and/or mortgage services. This includes but is not limited to: Information you provide in order to purchase a home and/or obtain a home loan including your name, phone number, address, social security number, email address, employer's name and address, income, assets, liabilities, and answers to questions of both personal and financial matters; communications from you regarding your loan(s) such as a change of employment; information obtained from third parties such as consumer reporting agencies or credit bureaus, employers, depository institutions and others, that we use to evaluate a loan application; information that we may gather in compliance with certain laws and regulations, such as the Home Mortgage Disclosure Act.
Sharing of the Information Gathered on This Site
We share personal information about you, as required or permitted by law, with third parties, such as service providers who assist us in the day to day operations of our company in the administration, processing, servicing and sale of your loan. These third parties include among others, title companies, appraisers, insurance companies, underwriting services, processing services, printing companies, software providers, marketing services and purchasers of loans. Our policy is to require third party service providers to enter into confidentiality agreements with us, prohibiting them from using any personal information they obtain for any other purpose other than those for which they were retained or as required by law. We may also disclose information about you, when necessary or required, in legal and arbitration proceedings and to government agencies.
What Cookies Are and How They Are Used
A cookie is a small amount of data that is sent to your browser from a web server and stored on your computer's hard drive. Our site has programs that use cookies to maintain session information to remember who you are as you go from page to page. To protect your privacy we do not use cookies to store or transmit any personal information about you on the Internet.
External Links
This site contains external links (links to other sites). We are not responsible for the privacy practices or the content of such web sites. If you have any questions about this privacy statement, the practices of this site, or your dealings with this web site, please contact us.
Updating or Deleting Your Information, Including Demographic and Profile Data
You may update or delete your information at any time prior to completing an online data form. Once your online form is completed and submitted, you will not be able to change any of the information online. You will need to contact us via email, phone or postal mail to request that we update or delete your information.
Demographic and Profile Data
We may share certain aggregated demographic and profile data with government agencies. Aggregate data excludes information that would enable any individual to be identified. We also collect certain data (including your IP address) about your visit to our web site in our log files to enable us analyze site traffic and gather broad demographic data. The data in our log files are not linked to personally identifiable information.
If you have any questions about this privacy policy, please write us by mail here:
205 N Main Street
Salem, Indiana 47167


text:
Locking against concurrent editing
If two people try and edit the same wiki page at once some nasty conflicts can occur. Without any kind of warning system one of the editors can save the page, which leaves the other editor with a message warning them about the conflict. An easy way around this is to display warnings for editors that try to start editing wiki pages that are already being edited. i.e. the wiki keeps track of pages being edited.
This can be done in Moin using the editlock system. There are three levels of locking: to warn, to lock and None (turned off).
If you configure Moin to warn, when someone tries to edit a page that is already being edited, they will be presented with a warning message asking them to consider waiting until the current editor has finished.
Moin can also be configured to lock an edited page, only during editing. Here, if some tries to edit a page that is being edited they will receive a message saying that the page is locked and will not be able to edit it until the editor has finished.
A complication of this feature is that an editing session might be started and might not be finished. e.g.:
- Someone presses edit and then clicks on a link to exit the page without cancelling.
- The browser window is closed without cancelling.
- The back button is pressed.
- Someone starts editing a page and forgets and leaves it open overnight.
This would result in a page having permanent warnings or being permanently locked. Therefore, both warn and lock have a timeout feature. After a specified number of minutes the feature expires. Note that the timer restarts when you hit preview. If you are actively editing a page and hit preview it is assumed you are still busy and the timer starts again. If you leave the page, or exit it for more time than the timer allows the edit locking runs out and other people are free to edit the page.
The edit_locking config variable controls the behaviour of the locking system. This can have the following values:
None, i.e. there is no edit locking. The feature is turned off and nobody is warned or stopped from doing simultaneous edits of a page.
"warn <timeout>" tells Moin to warn anyone trying to concurrently editing a page, with a specified timeout, e.g. "warn 10" will warn for 10 minutes after an edit is started.
"lock <timeout>" tells Moin to lock a page for the specified amount of time after an edit started. e.g. "lock 5" locks a page for 5 minutes.
Aborting an edit
For the reasons explained in the timeout description above, you should always use Cancel to cancel an edit if you have enabled edit locking!
Sample interaction of JohnMiller and JaneDoe...
- no locking (None)
JohnMiller starts editing a page and JaneDoe thinks she'll edit the same page. She has no idea that someone else is editing the page so they both edit away and hit save. It doesn't matter who started first and did the most editing, whoever hits save changes first will have their changes committed and the unfortunate 2nd editor will have to try and merge their changes in or lose them.
- edit warnings (warn)
JohnMiller starts editing a page and JaneDoe thinks she'll edit the same page. When she hits edit she'll see a warning telling her that someone else got there first. If she is polite she'll leave the page, but she can still save before John and he may lose his changes.
- edit locking (lock)
JohnMiller starts editing a page and JaneDoe thinks she'll edit the same page. When she hits edit she'll see a warning telling her that someone else got there first and the page is locked. She will have to wait for the page to become available.


text:
Not registered yet? Forgot your password?
To ensure that Christchurch School Of Gymnastics can respond to your email, please ensure you provide all appropriate contact details. We highly recommend you include your phone number.
Bold fields are required.
Your rating (On a scale of 1 to 5, with 5 being the best)


text:
Adding Art to Office Documents
- Introduction
- Locating and Inserting Clip Art
- Inserting a Picture
- Adding a Quick Style to a Picture
- Applying a Shape to a Picture
- Applying a Border to a Picture
- Applying Picture Effects
- Modifying Picture Size
- Compressing a Picture
- Modifying Picture Brightness and Contrast
- Recoloring a Picture
- Cropping and Rotating a Picture
- Scanning and Imaging Documents
- Managing Pictures
- Creating WordArt Text
- Formatting WordArt Text
- Applying WordArt Text Effects
- Modifying WordArt Text Position
- Creating SmartArt Graphics
- Formatting a SmartArt Graphic
- Modifying a SmartArt Graphic
- Creating an Organization Chart
- Modifying an Organization Chart
- Inserting and Creating a Chart
- Changing a Chart Type
- Changing a Chart Layout and Style
- Changing Chart Titles
- Changing Chart Labels
- Formatting Line and Bar Charts
- Editing Chart Data
- Saving a Chart Template
What You'll Do
- Locate and Insert Clip Art
- Insert a Picture
- Add a Quick Style to a Picture
- Apply a Shape and Border to a Picture
- Apply Picture Effects
- Modify Picture Size
- Compress a Picture
- Modify Picture Brightness and Contrast
- Recolor a Picture
- Crop, Rotate and Recolor a Picture
- Scan and Image Documents
- Manage Pictures
- Create and Format WordArt Text
- Apply and Modify WordArt Text Effects
- Create and Format SmartArt Graphics
- Modify a SmartArt Graphic
- Create and Modify an Organization Chart
- Insert and Create a Chart
- Change a Chart Layout and Style
- Change Chart Titles and Labels
- Format Line and Bar Charts
- Edit Chart Data
- Save a Chart Template
Although well-illustrated documents can't make up for a lack of content, you can capture your audiences' attention if your documents are vibrant and visually interesting. Microsoft Office comes with a vast array of clip art, and there are endless amounts available through other software packages or on the Web. When going online to look at clips, you can categorize them so that it's easier to find the best choice for your Office document. You can use the Microsoft Online Web site to search for and download additional clip art.
You can easily enhance an Office document by adding a picture—one of your own or one of the hundreds that come with Microsoft Office. If you need to modify your pictures, you can resize them, compress them for storage, change their brightness or contrast, recolor them, or crop them.
WordArt is another feature that adds detail to your document. Available in other Office programs, WordArt can bring together your documents—you can change its color, shape, shadow, or size. Because WordArt comes with so many style choices, time spent customizing your documents is minimal.
In Office programs, you can insert SmartArt graphics (New!) to create diagrams that convey processes or relationships. Office provides a wide-variety of built-in SmartArt graphic types from which to choose, including graphical lists, process, cycle, hierarchy, relationship, matrix, and pyramid. Using built-in SmartArt graphics makes it easy to create and modify charts without having to create them from scratch.
Instead of adding a table of dry numbers, insert a chart. Charts add visual interest and useful information represented by lines, bars, pie slices, or other markers. Office uses Microsoft Excel (New!) to embed and display the information in a chart.