2011-12-13 4 views
5

में .dot फ़ाइल से छवि बनाएं I निर्देशित विश्वकोश ग्राफ का प्रतिनिधित्व करने के लिए .dot फ़ाइल बना रहा हूं।सी #

मुझे इस graph.dot फ़ाइल (सी # का उपयोग करके) से एक छवि उत्पन्न करने की आवश्यकता है ताकि मैं अपने आवेदन में एक चित्र बॉक्स में छवि दिखा सकूं। मुझे किस लाइब्रेरी का उपयोग करना चाहिए?

कमांड प्रॉम्प्ट में Graphviz के आदेश का उपयोग करना:

dot -Tpng graph.dot -o graph.png 

मैं छवि ठीक उत्पन्न करने में सक्षम हूँ, इसलिए मैं जानता हूँ कि मेरे .dot फ़ाइल की फ़ॉर्मेटिंग सही है।

धन्यवाद।

+0

तो मुझे लगता है कि आप अपने सी # एप्लिकेशन से सिर्फ डॉट यूटिलिटी नहीं चलाना चाहते हैं? – RQDQ

+0

नहीं, यह वही नहीं है जो मैं चाहता हूं। – Rachel

उत्तर

4

डेविड ब्राउन की परियोजना को इंगित करने के लिए @marapet धन्यवाद। David Brown's Implicit Operator

नमूना अच्छी तरह से काम करता है:

मैं कम से नमूना डाउनलोड किया है।

मैंने अपनी परियोजना में आवश्यक कोड कॉपी किया। मुझे अपना .NET लक्ष्य फ्रेमवर्क 4.0 से 3.5 तक बदलना पड़ा, लेकिन यह कोई समस्या नहीं है।

अभी तक, कोड कभी क्रैश नहीं हुआ है। (भले ही अन्य लोगों के मुद्दों सूचना दी है।)

अद्यतन

डेविड ब्राउन की वेबसाइट नीचे तो मैं कोड मैं वेबसाइट से लिया था के साथ इस जवाब को अद्यतन किया है हो रहा है।

//Code for this Class downloaded from http://implicitoperator.com/blog/2010/4/11/graphviz-c-sample.html 

public class GraphViz 
{ 

    public const string LIB_GVC = "gvc.dll"; 
    public const string LIB_GRAPH = "graph.dll"; 
    public const int SUCCESS = 0; 

    /// <summary> 
    /// Creates a new Graphviz context. 
    /// </summary> 
    [DllImport(LIB_GVC)] 
    public static extern IntPtr gvContext(); 

    /// <summary> 
    /// Reads a graph from a string. 
    /// </summary> 
    [DllImport(LIB_GRAPH)] 
    public static extern IntPtr agmemread(string data); 

    /// <summary> 
    /// Renders a graph in memory. 
    /// </summary> 
    [DllImport(LIB_GVC)] 
    public static extern int gvRenderData(IntPtr gvc, IntPtr g, 
     string format, out IntPtr result, out int length); 

    /// <summary> 
    /// Applies a layout to a graph using the given engine. 
    /// </summary> 
    [DllImport(LIB_GVC)] 
    public static extern int gvLayout(IntPtr gvc, IntPtr g, string engine); 

    /// <summary> 
    /// Releases the resources used by a layout. 
    /// </summary> 
    [DllImport(LIB_GVC)] 
    public static extern int gvFreeLayout(IntPtr gvc, IntPtr g); 

    /// <summary> 
    /// Releases a context's resources. 
    /// </summary> 
    [DllImport(LIB_GVC)] 
    public static extern int gvFreeContext(IntPtr gvc); 

    /// <summary> 
    /// Releases the resources used by a graph. 
    /// </summary> 
    [DllImport(LIB_GRAPH)] 
    public static extern void agclose(IntPtr g); 

    public static Image RenderImage(string source, string layout, string format) 
    { 
     // Create a Graphviz context 
     IntPtr gvc = gvContext(); 
     if (gvc == IntPtr.Zero) 
      throw new Exception("Failed to create Graphviz context."); 

     // Load the DOT data into a graph 
     IntPtr g = agmemread(source); 
     if (g == IntPtr.Zero) 
      throw new Exception("Failed to create graph from source. Check for syntax errors."); 

     // Apply a layout 
     if (gvLayout(gvc, g, layout) != SUCCESS) 
      throw new Exception("Layout failed."); 

     IntPtr result; 
     int length; 

     // Render the graph 
     if (gvRenderData(gvc, g, format, out result, out length) != SUCCESS) 
      throw new Exception("Render failed."); 

     // Create an array to hold the rendered graph 
     byte[] bytes = new byte[length]; 

     // Copy the image from the IntPtr 
     Marshal.Copy(result, bytes, 0, length); 

     // Free up the resources 
     gvFreeLayout(gvc, g); 
     agclose(g); 
     gvFreeContext(gvc); 

     using (MemoryStream stream = new MemoryStream(bytes)) 
     { 
      return Image.FromStream(stream); 
     } 
    } 
} 
+0

यह बढ़िया है!क्या आप ओएस और ग्राफविज़ संस्करण का उपयोग कर रहे हैं साझा करना चाहते हैं? – marapet

+1

@marapet मैं SP1 के साथ विंडोज 7 व्यावसायिक 64-बिट का उपयोग कर रहा हूं। ग्राफविज़ संस्करण 2.28.0 है, जैसा कि http://www.graphviz.org/Download_windows.php से डाउनलोड किया गया है। कोड अभी भी क्रैश नहीं हुआ है :) – Rachel

+0

अरे, क्या आपके पास अभी भी नमूना है? वेबसाइट नीचे है और मुझे उस कोड को देखने की ज़रूरत है। – pmichna

2

आप प्रक्रिया इस्तेमाल कर सकते हैं dot.exe

ProcessStartInfo startInfo = new ProcessStartInfo("dot.exe"); 
startInfo.Arguments = "-Tpng graph.dot -o graph.png"; 

Process.Start(startInfo); 
+0

आपके इनपुट के लिए धन्यवाद। यह काम करता है, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं पसंद करूंगा कि अगर मैं कुछ लाइब्रेरी का उपयोग कर सकता हूं जिसमें एक विधि है जो .dot फ़ाइल को पैरामीटर (या फ़ाइल में मिली स्ट्रिंग) के रूप में लेती है और छवि लौटाती है। – Rachel

+0

@ राहेल कोई समस्या नहीं, एक झगड़ा का थोड़ा सा लेकिन मैं सोच सकता था। –

+0

+1 हां, यह एक हैक है। लेकिन कभी-कभी इस तरह एक हैक आपको बांध से बाहर कर सकता है। – user

2

यह एक कठिन एक है शुरू करने के लिए, मैंने पाया Graphviz के लिए एक .NET आवरण GrapVizNet जो शायद यह संभव बनाता है कहा जाता है।

एक और दिलचस्प व्यक्ति PInvoke के साथ अपना स्वयं का रैपर बना रहा है। मेरा मानना ​​है कि this बिल्कुल वही है जो आपको चाहिए। सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन शायद आपको मिल गया।

+2

डेविड ब्राउन की परियोजना वास्तव में वास्तव में सवाल में क्या पूछती है। एकमात्र समस्या यह है कि हाल के संस्करणों में एक बग प्रतीत होता है - एसओ पर भी डेविड ब्राउन का प्रश्न देखें: http://stackoverflow.com/a/4876966/63733 – marapet

+0

@marapet +1 इसे देखने के लिए। एक त्वरित खोज मुझे कोई जानकारी नहीं देती है कि यह बग तय किया गया है या नहीं। आपको यह पता लगाने की कोशिश करनी होगी। –

+0

यह नहीं है - कम से कम बग रिपोर्ट की स्थिति के अनुसार नहीं ([1870] (http://www.graphviz.org/bugs/b1870.html) और [1775] (http: //www.graphviz .org/bugs/b1775.html)) @ डेविड ब्राउन द्वारा दायर किया गया। किसी ने एक ही संकलक के साथ खिड़कियों पर खुद ग्राफविज़ बनाने का सुझाव दिया - यह नहीं पता कि इससे मदद मिलती है या नहीं। – marapet