2017-04-14 35 views

回答

2

将图像导入到Visio中时,它们会被包装成标准形状(具有visTypeForeignObject的Type属性)。

从那里你只是在与ShapeSheet中的单元格交谈。 (有关ShapeSheet http://visualsignals.typepad.co.uk/vislog/2007/10/just-for-starte.html的更多详细信息,请参阅此帖子)

因此,您可以从Visio上的宏记录器开始使用这类事物。图片拖动到页面上,会产生输出是这样的:

Sub Macro1() 

    'Enable diagram services 
    Dim DiagramServices As Integer 
    DiagramServices = ActiveDocument.DiagramServicesEnabled 
    ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150 

    Dim UndoScopeID2 As Long 
    UndoScopeID2 = Application.BeginUndoScope("Auto Size Page") 
    Application.ActiveWindow.Page.AutoSize = False 
    Application.EndUndoScope UndoScopeID2, True 

    Dim UndoScopeID3 As Long 
    UndoScopeID3 = Application.BeginUndoScope("Insert") 
    Application.ActiveWindow.Page.Import "C:\SomeImage.jpg" 
    Application.EndUndoScope UndoScopeID3, True 

    ActiveWindow.DeselectAll 
    ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(1), visSelect 
    Application.ActiveWindow.Selection.Move 2.129396, -0.904364 

    Dim UndoScopeID4 As Long 
    UndoScopeID4 = Application.BeginUndoScope("Size Object") 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "46.261665987369 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "212.02916285428 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = "103.47666530807 mm" 
    Application.EndUndoScope UndoScopeID4, True 

    Dim UndoScopeID5 As Long 
    UndoScopeID5 = Application.BeginUndoScope("Size Object") 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "46.261665987369 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "185.77916321819 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = "73.441667394486 mm" 
    Application.EndUndoScope UndoScopeID5, True 

    'Restore diagram services 
    ActiveDocument.DiagramServicesEnabled = DiagramServices 

End Sub 

宏录制在当前选择上操作,但你并不需要。此外,它使用SRC(节,行,列)语法,而不是更简单的单元名称语法。所以的翻译上面可能是这样的:

Sub TestAddImage() 
    Call DropImage(ActivePage, "C:\SomeImage.jpg") 
End Sub 

Private Sub DropImage(ByRef vPag As Visio.Page, imageFile As String) 

If Not vPag Is Nothing Then 
    Dim newShp As Visio.Shape 
    Set shpNew = vPag.Import(imageFile) 
    'Set position 
    shpNew.CellsU("PinX").FormulaU = "75mm" 
    shpNew.CellsU("PinY").FormulaU = "175mm" 
    'Set size 
    shpNew.CellsU("Width").FormulaU = "100mm" 
    shpNew.CellsU("Height").FormulaU = "80mm" 
End If 

End Sub 

C#的这个版本是这样的:

void Main() 
{ 
    var vApp = MyExtensions.GetRunningVisio(); 
    DropImage(vApp.ActivePage, @"C:\SomeImage.jpg"); 
} 

private void DropImage(Visio.Page vPag, string imageFile) 
{ 
    if (vPag != null) 
    { 
     var shpNew = vPag.Import(imageFile); 
     //Set position 
     shpNew.CellsU["PinX"].FormulaU = "75mm"; 
     shpNew.CellsU["PinY"].FormulaU = "175mm"; 
     //Set size 
     shpNew.CellsU["Width"].FormulaU = "100mm"; 
     shpNew.CellsU["Height"].FormulaU = "80mm"; 
    } 
} 

注意GetRunningVisio是我与LinqPad使用扩展方法:

http://visualsignals.typepad.co.uk/vislog/2015/12/getting-started-with-c-in-linqpad-with-visio.html

......但这取决于你如何得到应用程序对象。

+0

约翰,那太棒了,它工作完美。但有什么内置的将形状放置在页面的末尾,如shpNew.cellsu.end?或者是否需要运行一个宏来查找您在“sub Macro1”中显示的坐标? – Puneeth

+1

为此,您需要向PinX/Y单元添加公式而不是常量值。对于PinX:'“ThePage!PageWidth-(Width-LocPinX)”'和PinY'“ThePage!PageHeight-(Height-LocPinY)”'。这将设置页面左上角的形状。 – JohnGoldsmith

+0

对不起,我的问题是放在页面的底部,我相信用+修改公式会在页面底部设置形状,不是吗? – Puneeth

相关问题