将Visio形状的x,y位置从模板文件C#设置为图形

时间:2018-07-20 16:39:06

标签: c# visual-studio visio

我有一个模板文件(.vsdx),其中包含带有固定x和y轴的图形,并将其加载到新的Visio文档中。我设法在Visio文档上插入了一个形状,但是它没有根据图形的x和y轴定位。 示例:将vshape(坐标为0,0位置)设置到文档的左下角边缘。

到目前为止,我有以下代码:

        <el-upload
            class="avatar-uploader"
            ref="upload"
            action="/app/admin/product-image"
            :with-credentials="true"
            :thumbnail-mode="true"

            :file-list="fileList"
            :on-success="handleAvatarSuccess"
            :on-change="picPreview"
            :on-error="uploadError"
            :auto-upload="true"
            :data="{product_id:data.id}"
            :multiple="false"
            :on-preview="handlePictureCardPreview"
                        :on-remove="handleRemove"
                        list-type="picture-card"
            :before-upload="beforeAvatarUpload">
            <i class="el-icon-plus"></i>
        </el-upload>


        <el-dialog :visible.sync="dialogVisible">
            <img width="100%" :src="dialogImageUrl" alt="">
        </el-dialog>

要加载到Visio文档上的图形是here

1 个答案:

答案 0 :(得分:0)

好的,谢谢您的更新评论。在这种情况下,这是一个快速示例。我创建了一个具有基本“图形”母版形状(定义了原点)和“点”母版的图形,该点只是作为dta标记可放下的一个小圆圈。

代码(using LINQPad)查找Graph master的第一个实例,然后查找(由您定义)“已知”单元格以掌握原点。然后,它相对于Graph原点放置两个“点”形。

这是Graph形状的样子:

enter image description here

[注意-您可以在X或Y单元格中引用PNT类型,Visio会提取相应的X或Y坐标]

void Main()
{
    var vApp = MyExtensions.GetRunningVisio();
    var vPag = vApp.ActivePage;

    var graphShp = vPag.Shapes.Cast<Visio.Shape>()
                   .FirstOrDefault(s => s.Master?.Name == "Graph");
    if (graphShp != null)
    {
        var dotMst = vPag.Document.Masters["Dot"];

        //Get x / y back as a named tuple
        var origin = GetGraphOrigin(graphShp);

        //Green fill is the default defined in the master
        var greenDotShp = vPag.Drop(dotMst, origin.x, origin.y);

        //Use offest based on graph origin
        var redDotOffsetX = -0.5;
        var redDotOffsetY = 0.25;
        var redDotShp = vPag.Drop(dotMst, origin.x + redDotOffsetX, origin.y + redDotOffsetY);
        redDotShp.CellsU["FillForegnd"].FormulaU = "RGB(200,40,40)";
    }
}

private (double x, double y) GetGraphOrigin(Visio.Shape targetShp) 
{
    const string originX = "User.OriginOnPageX";
    const string originY = "User.OriginOnPageY";

    if (targetShp == null)
    {
        throw new ArgumentNullException();
    }
    if (targetShp.CellExistsU[originX, (short)Visio.VisExistsFlags.visExistsAnywhere] != 0
        && targetShp.CellExistsU[originY, (short)Visio.VisExistsFlags.visExistsAnywhere] != 0)
    {
        return (x: targetShp.CellsU[originX].ResultIU, 
                y: targetShp.CellsU[originY].ResultIU);
    }
    return default;
}

因此,如果您运行此代码,则应该以如下形式结束(假设您如上所述从图纸开始):

enter image description here

因此,有很多方法可以解决此问题,但是可能需要一些方法或读取Graph形状中的原点,然后将其用于定位“点”形。