۱۳۸۸/۰۳/۰۶

رسم گراف


كتابخانه‌هاي زيادي براي رسم گراف وجود دارند منجمله mxGraph كه براي استفاده غيرتجاري رايگان و سورس باز است. mxGraph نگارش‌هاي PHP ، Java‌ و JavaScript ايي نيز دارد كه به همراه بسته مربوطه ارائه مي‌شوند.
پس از دريافت آن، در فولدري به نام dotnet مي‌توانيد سورس كتابخانه مربوط به دات نت فريم ورك آن‌را دريافت كنيد.
فايل پروژه‌ي VS.Net را در آن فولدر نخواهيد يافت. حتي آن‌را كامپايل هم نكرده‌اند. (احتمالا به اين دليل كه كسي نپرسد اين پروژه با چه محصولي توليد شده و آيا لايسنس استفاده از آن را داريد يا خير. اين هم يك روش است ...)
براي كامپايل آن، يك پروژه library جديد را در VS.Net آغاز كرده و پوشه‌هاي موجود در پوشه‌ي dotnet را به آن افزوده و سپس آن‌را كامپايل كنيد تا فايل mxGraph.dll توليد شود.

يك مثال ساده از نحوه‌ي استفاده‌ي آن به صورت زير است كه فايل test.png را توليد خواهد كرد.
using System;
using System.Drawing;
using System.Windows.Forms;
using com.mxgraph;
using System.Drawing.Imaging;

void Test1()
{
// Creates graph with model
mxGraph graph = new mxGraph();
Object parent = graph.GetDefaultParent();

// Adds cells into the graph
graph.Model.BeginUpdate();
try
{
Object v1 = graph.InsertVertex(parent, null, "سلام", 20, 20, 80, 30, "strokeColor=#FFCF8A;fillColor=#FFCF8A;gradientColor=white;fontBold=true;fontFamily=tahoma;rounded=true;shadow=true;shape=ellipse");
Object v2 = graph.InsertVertex(parent, null, "!دنياي ظالم", 200, 150, 80, 30, "rounded=true;shadow=true;fontFamily=tahoma");
Object e1 = graph.InsertEdge(parent, null, "e1", v1, v2, "fontFamily=tahoma");
}
finally
{
graph.Model.EndUpdate();
}

mxCellRenderer.CreateImage(graph, null, 1,
Color.White, true, null).Save("test.png", ImageFormat.Png);
}




و يا اگر قصد داشته باشيد كه از آن در ASP.Net استفاده كنيد، يك generic handler را به پروژه خود افزوده (مثلا ImageHandler.ashx) و كد آن‌را براي مثال به صورت زير تغيير دهيد:

using System;
using System.Web;
using com.mxgraph;
using System.Drawing;
using System.Web.Services;
using System.IO;
using System.Drawing.Imaging;

namespace test
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// Creates graph with model
mxGraph graph = new mxGraph();
Object parent = graph.GetDefaultParent();

// Adds cells into the graph
graph.Model.BeginUpdate();
try
{
Object v1 = graph.InsertVertex(parent, null, "سلام", 20, 20, 80, 30, "strokeColor=#FFCF8A;fillColor=#FFCF8A;gradientColor=white;fontBold=true;fontFamily=tahoma;rounded=true;shadow=true;shape=ellipse");
Object v2 = graph.InsertVertex(parent, null, "!دنياي ظالم", 200, 150, 80, 30, "rounded=true;shadow=true;fontFamily=tahoma");
Object e1 = graph.InsertEdge(parent, null, "e1", v1, v2, "fontFamily=tahoma");
}
finally
{
graph.Model.EndUpdate();
}

Image image = mxCellRenderer.CreateImage(graph, null, 1, Color.White, true, null);

// Render BitMap Stream Back To Client
MemoryStream memStream = new MemoryStream();
image.Save(memStream, ImageFormat.Png);

memStream.WriteTo(context.Response.OutputStream);
}

public bool IsReusable
{
get
{
return false;
}
}
}

}
اكنون نحوه استفاده از اين handler در يك صفحه وب به صورت زير است:
<img src="ImageHandler.ashx" />