7

我正在尝试使用 Visio 2010 COM Interops 以编程方式创建时间线和标记。我的代码基于 Chris Castillo 的 2 部分博客文章(第 1部分、第 2 部分),这是我能够找到的关于如何执行此操作的唯一半完整示例。然而,他的博客(从 2004 年开始)似乎无法正常工作。里程碑并没有真正连接到时间线,更新它们的日期并不能让它们移动到正确的位置。

有什么建议或修复吗?

在此处输入图像描述

Imports Microsoft.Office.Interop.Visio
Imports System.Diagnostics.CodeAnalysis
Imports System.Runtime.InteropServices

...

Dim VisioApp As New Application

Dim myDoc As Document = VisioApp.Documents.Add("")
Dim myPage As Page = myDoc.Pages.Item(1)

Dim TimelineStencils As Document =
    VisioApp.Documents.Add("Timeline Shapes.vss")

Dim theTimeline As Shape
Dim theMilestone As Shape

VisioApp.AlertResponse = 1

theTimeline = myPage.Drop(
    TimelineStencils.Masters.ItemU("Block timeline"), 5.610236, 5.511811)

theTimeline.CellsU("User.visBeginDate").FormulaU = _
        VisioApp.ConvertResult(
            "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theTimeline.CellsU("User.visEndDate").FormulaU = _
    VisioApp.ConvertResult(
        "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

VisioApp.Addons("ts").Run("/cmd=3")

theMilestone = myPage.Drop( _
    TimelineStencils.Masters.ItemU("Line milestone"), _
    5.610236, 5.511811)

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
    VisioApp.ConvertResult(
        "7/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

VisioApp.AlertResponse = 0
4

2 回答 2

1

因此,我发现了一个更好的以编程方式添加 visio 对象的演练,@JohnGoldsmith 在他对相关问题的其他一些答案中链接到这些对象,并找到了一种更好的创建模板和页面的方法,并且它正在工作!

Dim VisioApp As New Application

Dim myDoc As Document = VisioApp.Documents.Add("Timeline.vst")
Dim myPage As Page = myDoc.Pages.Item(1)

Dim TimelineStencilName As String = "TIMELN_M.VSS"
Dim TimelineStencilDoc As Document

For Each Doc As Document In VisioApp.Documents
    If Doc.Name = TimelineStencilName Then
        TimelineStencilDoc = Doc
        Exit For
    End If
Next

Dim TimelineMaster As Master =
    TimelineStencilDoc.Masters.ItemU("Block timeline")

Dim MilestoneMaster As Master =
    TimelineStencilDoc.Masters.ItemU("Line milestone")

Dim theTimeline As Shape
Dim theMilestone As Shape

theTimeline = myPage.Drop(TimelineMaster, 5.610236, 5.511811)

theTimeline.CellsU("User.visBeginDate").FormulaU = _
    VisioApp.ConvertResult(
            "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theTimeline.CellsU("User.visEndDate").FormulaU = _
    VisioApp.ConvertResult(
        "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theMilestone = myPage.Drop( _
    MilestoneMaster, _
    5.610236, 5.511811)

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
    VisioApp.ConvertResult(
        "10/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
于 2012-09-27T20:18:02.277 回答
1

在 Visio 2010 上针对内置模板(“TIMELN_M.VSS”)和模板运行 Chris 的代码,我发现它运行良好。但是,如果您使用空白文档对内置模具运行它,则不会显示“描述”和“日期”形状数据字段。这两个字段的可见性取决于文档 ShapeSheet中的用户单元格(“User.visTLShowProps”),该单元格要么由插件添加,要么在删除其中一个母版时添加。

标准模板包含两个持久事件,它们调用 DocumentCreated 和 DocumentOpened 插件中的功能,并且再次添加几个其他用户单元格,用于切换上述值的开和关,或者它们存在于模板中. 在任何情况下,如果您不使用原始模板,这些都不会添加到 Document ShapeSheet。

这意味着您需要自己切换值。例如(一个快速的 VBA 示例):

Private Sub SetTlShowProps(ByRef vDoc As Visio.Document)
If (Not vDoc Is Nothing) Then
    Dim docShp As Visio.Shape
    Set docShp = vDoc.DocumentSheet
    If (docShp.CellExistsU("User.visTLShowProps", 0)) Then
        docShp.CellsU("User.visTLShowProps").FormulaU = 1
    End If
End If
End Sub

或者,当然您可以将这些“推送”单元格添加到您自己的 ShapeSheet 文档模板中:

User.visTLShowPropsOn = SETF(GetRef(User.visTLShowProps),1)

User.visTLShowPropsOff = SETF(GetRef(User.visTLShowProps),0)

如果这不能解决您的问题,最后一点是,您是否使用不同的或派生的模板(“Timeline Shapes.vss”)?

于 2012-09-27T09:48:40.437 回答