Sparx EA .feap将图像保存为空白

时间:2017-03-14 11:49:41

标签: c# firebird enterprise-architect

在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),所有已保存/已报告的报告图像均为空白,像这样下面

enter image description here

为什么会发生并且有解决方法?

UPD

如果我使用projectInterface.PutDiagramImageOnClipboard代替,但我根本不会使用clipboard

UPD 2

今天早上做了一些实验(在我的时区,gmt + 3,它仍然是早上),我发现问题出在 GUID 注册!

我决定在这里申请.toUpper()

  

var diagramByGuid = projectInterface.GUIDtoXML(eaDiagramGuid.ToString("B").ToUpper());

它开始工作正常!

enter image description here

奇怪的是,如果项目是*.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)时,它会像这里一样以小写形式转换所有内容

enter image description here

所以,这就是我遇到问题的原因。

但由于某种原因,它没有出现在*.EAP类型的项目中!

同样奇怪的是,在那种情况下,注册很重要。看起来像GUID和sparx ea中的GUID是不同的东西!

1 个答案:

答案 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,只是字符串键(我假设)。

与他们一起工作时要小心: - )