2012-09-25 23 views
6

Estoy intentando crear mediante programación una línea de tiempo y marcadores utilizando Visio 2010 COM Interops. Mi código se basa en la publicación de 2 partes del blog de Chris Castillo (Part 1, Part 2), que es el único ejemplo semi-completo que he podido encontrar sobre cómo hacerlo. Sin embargo, su blog (desde 2004) no parece funcionar bien. Los hitos no están realmente conectados a la línea de tiempo, y actualizar su fecha no hace que se muevan al lugar correcto.Cómo coloco programáticamente un Milestone en una línea de tiempo de bloque en Visio

¿Alguna sugerencia o solución?

enter image description here

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 

Respuesta

2

así que encontré un much better walk-through de agregar mediante programación objetos de Visio que @JohnGoldsmith vinculados en some of his other answers a preguntas relacionadas, y se encontró una mejor manera de crear las plantillas y la página, y está funcionando!

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) 
+0

Y para cualquier persona que esté teniendo problemas con todo esto, estas son las instrucciones para activar el Modo de desarrollador, que permite a ShapeSheets http://www.visguy.com/2008/08/04/top-9-reasons-for-turning -on-desarrollador-modo –

2

Ejecución de código de Chris contra el construido en la plantilla ("TIMELN_M.VSS") y la plantilla de Visio 2010 me encontré con que funcionaba perfectamente. Sin embargo, si lo ejecuta contra la galería de símbolos incorporada con un documento en blanco, no se mostrarán los campos de datos de Descripción y Fecha. La visibilidad de estos dos campos depende de una celda de usuario ("User.visTLShowProps") en el Document ShapeSheet que se agrega mediante el complemento o se agrega cuando se descarta uno de los másters.

La plantilla estándar contiene dos persistent events que llaman funcionalidad en el complemento para DocumentCreated y DocumentOpened y, nuevamente, estos agregan un par de otras celdas de usuario que se usan para activar y desactivar el valor anterior, o existen en la plantilla. En cualquier caso, estos no se agregan a Document ShapeSheet si no está utilizando la plantilla original.

Esto significa que debe alternar el valor usted mismo. Por ejemplo (un ejemplo rápido 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 

O, por supuesto, usted podría añadir esas células 'empuje' en estás plantilla de documento propio en el ShapeSheet:

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

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

Un punto final si esto no resuelve tu problema es, ¿estás usando una galería de símbolos diferente o derivada ("Timeline Shapes.vss")?

+0

Gracias por su ayuda John. Cuando ejecutó el código de Chris y funcionó, ¿fue eso desde una aplicación independiente, o desde dentro de Visio en algún tipo de consola VBA? Cambié mi galería de símbolos de la línea de tiempo a "TIMELN_M.VSS", pero sigo obteniendo los mismos resultados. Tenía la impresión de que eran lo mismo. –

+0

Además, ¿hay algo que pueda cambiar Dim myDoc As Document = VisioApp.Documents.Add ("") para cargar el documento de línea de tiempo en lugar de un documento en blanco? –

Cuestiones relacionadas