在Sparx EA的插件中,我使用此代码来获取图片并分配给实体。然后我使用来自实体的图像,例如,保存在某些文件夹中或插入单词报告等(来自此answer)
/// <summary>
/// Access to diagram image without using clipboard
/// </summary>
/// <param name="projectInterface">Ea Sparx interface</param>
/// <param name="eaDiagramGuid">Guid of the diagramm</param>
/// <returns></returns>
public static Image GetDiagramImage(this Project projectInterface, Guid eaDiagramGuid, ApplicationLogger _logger)
{
Image diagramImage;
try
{
var diagramByGuid = projectInterface.GUIDtoXML(eaDiagramGuid.ToString("B"));
string tempFilename = string.Format("{0}{1}{2}", Path.GetTempPath(), Guid.NewGuid().ToString(), ".png");
bool imageToFileSuccess = projectInterface.PutDiagramImageToFile(diagramByGuid, tempFilename, FileExtensionByName);
if (imageToFileSuccess)
{
using (var imageStream = new MemoryStream(File.ReadAllBytes(tempFilename)))
{
diagramImage = Image.FromStream(imageStream);
}
File.Delete(tempFilename);
}
else
{
throw new Exception(string.Format("Image to file exprot fail {0}", projectInterface.GetLastError()));
}
}
catch (Exception e)
{
throw;
}
return diagramImage;
}
问题是 - 如果我使用保存为.eap
文件的项目,它可以正常工作。
如果它是.feap
文件,我认为这意味着它适用于Firebird
数据库(而不是Access
),所有已保存/已报告的报告图像均为空白,像这样下面
为什么会发生并且有解决方法?
UPD
如果我使用projectInterface.PutDiagramImageOnClipboard
代替,但我根本不会使用clipboard
UPD 2
今天早上做了一些实验(在我的时区,gmt + 3,它仍然是早上),我发现问题出在 GUID 注册!
我决定在这里申请.toUpper()
var diagramByGuid = projectInterface.GUIDtoXML(eaDiagramGuid.ToString("B").ToUpper());
它开始工作正常!
奇怪的是,如果项目是*.EAP
类型,即使guid不在上层寄存器中,一切都有效!
UPD3
嗯,不幸的是,我错了。 部分图片仍为空白。但不知何故,这些变化对图表产生了影响,我一直在测试这些东西。
有些照片出现两次或出错。 但它有点有趣(如果我可以这么说)行为。
UPD 4
我的 UPD2 部分错了! GUID可以包含向下注册符号以及高位符号。 所以,首先我删除了那部分。 我接下来做了什么 - 我开始直接从图中传递GUID,因此签名改变了
public static Image GetDiagramImage(this Project projectInterface, string eaDiagramGuid, ApplicationLogger _logger)
和eaDiagramGuid
应该从EA.Diagram
对象直接传递。
当我们通过Guid
将其解析为Guid.Parse(eaDiagramGuid)
时,它会像这里一样以小写形式转换所有内容
所以,这就是我遇到问题的原因。
但由于某种原因,它没有出现在*.EAP
类型的项目中!
同样奇怪的是,在那种情况下,注册很重要。看起来像GUID和sparx ea中的GUID是不同的东西!
答案 0 :(得分:1)
好的,正如我在这里创建的那样,事情是,*.FEAP
所有项目的GUID都具有令人惊讶的案例感。
所以,我的错误是将项目GUID存储为Guid
类型 - 当我们使用Guid.Parse(myGuidString)
函数然后我们将其转换回字符串时 - 所有符号都是小写的。
另外,我从支持得到了答案(他们的速度非常快,我真的很喜欢)
你好Danil,
在Stack Overflow上运行 - 听起来有效 回答。核心问题是Feap文件区分大小写。 技术上,用于我们的Firebird数据库的排序规则就是大小写 敏感。
因此,在自动化脚本中,您需要遵守该案例。
所以,我只是直接使用项目项目中的GUID字符串来改变工作,如
Image diagramImage = _eaProjectInterface.GetDiagramImage(diagram.DiagramGUID, _logger);
和功能现在看起来像这样
public static Image GetDiagramImage(this Project projectInterface, string eaDiagramGuid, ApplicationLogger _logger)
{
Image diagramImage;
try
{
var diagramByGuid = projectInterface.GUIDtoXML(eaDiagramGuid);
string tempFilename = string.Format("{0}{1}{2}", Path.GetTempPath(), Guid.NewGuid().ToString(), ".png");
bool imageToFileSuccess = projectInterface.PutDiagramImageToFile(diagramByGuid, tempFilename, FileExtensionByName);
if (imageToFileSuccess)
{
using (var imageStream = new MemoryStream(File.ReadAllBytes(tempFilename)))
{
diagramImage = Image.FromStream(imageStream);
}
File.Delete(tempFilename);
}
else
{
throw new Exception(string.Format("Image to file exprot fail {0}", projectInterface.GetLastError()));
}
}
catch (Exception e)
{
throw;
}
return diagramImage;
}
因此,这意味着Sparx EA *.FEAP
项目GUID NOT 真正的GUID,只是字符串键(我假设)。
与他们一起工作时要小心: - )