1

我调用了我在绘制图形所需的数据上编写的绘图函数。
绘图函数的工作方式如下:首先它创建一个文本文件。它基本上是一个 .dot 文件,这意味着 Graphviz / dot.exe 知道如何处理它。生成的文件如下所示:

graph{
resolution=1000;
1[
label ="" 
pos = "552,552!"
width = 0.002
height = 0.002
fixedsize=true
fontsize = 8
color =red
penwidth = 0.1, color = black, shape = box, width = 0.07, height = 0.07, label = ""
]
74[
label ="" 
pos = "450,552!"
width = 0.002
height = 0.002
fixedsize=true
fontsize = 8
color =red
shape = point
]
(...)
1 -- 74[penwidth = 0.099, color="red"]
74 -- 40[penwidth = 0.099, color="red"]
40 -- 32[penwidth = 0.099, color="red"]
32 -- 18[penwidth = 0.099, color="red"]
(...)
}

生成文件后,该函数使用以下标志调用 dot.exe 进程:

ProcessStartInfo startInfo = new ProcessStartInfo("dot.exe");
startInfo.Arguments = "-Kneato -Goverlap=prism -Tpng " + fileName + ".txt -o " + fileName + ".png";

我尝试过使用不同的标志、图像格式等,但这些都不能解决我的问题。

我的应用程序基本上由一个带有几个按钮和两个 PictureBox 的界面组成。单击其中一个按钮会导致“程序的重要部分”执行。
“重要部分”需要一些时间来执行,所以我为此使用了 BackgroundWorker。那里发生的事情(在 backgroundWorker1_DoWork 函数中)是:
有些事情被计算出来,我的绘图函数在结果数据上被调用了两次。它创建两个图像并将它们“放入”PictureBoxes。

它适用于大多数数据,但对于某些数据则不然。在某些数据上,PictureBoxes 中没有显示任何图片。当我检查应该创建文本文件和图像的文件夹时,我看到只有文本文件和应该进入第一个 PictureBox 的结果图片被创建......但甚至没有显示。我的结论是某些东西使整个 BackgroundWorker 进程停止,可能是 dot.exe 进程中的某种错误。
现在,每次调用该过程时,都会出现一个控制台一秒钟。那里可能会显示一些有用的数据,但我不知道如何阅读。

我的应用程序有一个先前版本且略有不同,它不适用于当前版本无法处理的相同数据。
然而,在旧版本中,我能够读取控制台输出(可能是因为整个程序崩溃了),它说的内容大致如下:

Graph is too large for cairo renderer bitmaps.   
Scaling by 0.4 to fit dot: failure to create cairo surface: out of memory. 

我得到这个错误主要是针对较大的图表,但不仅是针对较大的图表。一些较大的图表可以正常工作,而一些较小的图表则不行。无论如何,它们都不是特别大:最大的节点大约有 80 个。我认为它可能与分辨率或类似的东西有关,但是无论我更改什么参数,它仍然无法正常工作。

有人知道我应该尝试什么吗?您需要有关我的问题的任何额外信息吗?

编辑:此外,使用 -G 属性更改大小也无济于事。事实上,无论我做什么,我总是得到完全相同的错误,这意味着错误中提到的比例因子不会改变。

4

1 回答 1

0

事实证明我的问题不是 Graphviz 甚至是特定于图形的问题——我在网上找到的测试示例上测试了我的(元启发式)算法。在逐行读取最优解文件并将其拆分为单词时,""有时会被识别为单词。

于 2012-12-07T21:36:54.117 回答