如何:Visio SDK页面重新布局FlowChart从上到下

时间:2012-05-22 20:14:49

标签: layout sdk visio flowchart autolayout

我正在从代表流程图的分层数据集创建动态VSD。我不想/需要充分利用这些元素的绝对定位 - 自动布局选项可以正常工作。

问题是我无法弄清楚如何通过代码执行此命令。在UI(Visio 2010)中,命令位于功能区上:设计(选项卡) - >布局(组) - >重新布局(SplitButton)。

任何这些都可以。浏览Visio SDK文档和谷歌搜索几天没有太多用处。

有什么想法吗? (使用C#,但VB / VBA会这样做)

2 个答案:

答案 0 :(得分:3)

Page.Layout()方法本身是不够的。

在WBSTreeView.sln示例项目(VB.Net)中,我找到了如何完成此任务,但是在8小时之后无法发布我的答案:-x

通过查看下面使用的枚举,可以实现其他布局类型。 紧凑 - >对于我们正在创造的大多数流程,DownRight最终变得更好。

转换为C#:

        // auto-layout, Compact Tree -> Down then Right
        var layoutCell = this._page.PageSheet.get_CellsSRC(
            (short)VisSectionIndices.visSectionObject,
            (short)VisRowIndices.visRowPageLayout,
            (short)VisCellIndices.visPLOPlaceStyle);
        layoutCell.set_Result(
            VisUnitCodes.visPageUnits,
            (short)VisCellVals.visPLOPlaceCompactDownRight);
        layoutCell = this._page.PageSheet.get_CellsSRC(
            (short)VisSectionIndices.visSectionObject,
            (short)VisRowIndices.visRowPageLayout,
            (short)VisCellIndices.visPLORouteStyle);
        layoutCell.set_Result(
            VisUnitCodes.visPageUnits,
            (short)VisCellVals.visLORouteFlowchartNS);

        //// to change page orientation
        //layoutCell = this._page.PageSheet.get_CellsSRC(
        //    (short)VisSectionIndices.visSectionObject,
        //    (short)VisRowIndices.visRowPrintProperties,
        //    (short)VisCellIndices.visPrintPropertiesPageOrientation);
        //layoutCell.set_Result(
        //    VisUnitCodes.visPageUnits,
        //    (short)VisCellVals.visPPOLandscape);

        // curved connector lines
        layoutCell = this._page.PageSheet.get_CellsSRC(
            (short)VisSectionIndices.visSectionObject,
            (short)VisRowIndices.visRowPageLayout,
            (short)VisCellIndices.visPLOLineRouteExt); 
        layoutCell.set_Result(
            VisUnitCodes.visPageUnits, 
            (short)VisCellVals.visLORouteExtNURBS);


        // perform the layout
        this._page.Layout();
        // optionally resize the page to fit the space taken by its shapes
        this._page.ResizeToFitContents();
        // 

更改连接线颜色

如果您不熟悉颜色公式的工作方式,这也可能非常令人沮丧。 By default你可以用int作为字符串来获得预定义的颜色,但这并不是很有用,因为没有一种简单的方法可以弄清楚每种颜色是什么。 (有一个Page.Colors集合,但您必须检查每个RGB值并从中找出颜色。)

相反,您可以将自己的RGB值用于公式。

    private void SetConnectorLineColor(Shape connector, string colorFormula)
    {
        var cell = connector.get_Cells("LineColor");
        cell.Formula = colorFormula;
    }

    internal static class AnswerColorFormula
    {
        public static string Green = "RGB(0,200,0)";
        public static string Orange = "RGB(255,100,0)";
        public static string Yellow = "RGB(255,200,0)";
        public static string Red = "RGB(255,5,5)";
    }

答案 1 :(得分:1)

调用Layout对象上的Page方法。如果在此页面上选择了形状,则此方法仅对当前选择进行操作。您可能需要先在DeselectAll上致电ActiveWindow