我正在使用办公自动化将visio文件转换为指定的xml格式流程图,我需要使用泳道数据作为工作流程的容器。那么如何才能得到workflow shapes and swimlane之间的关系?
代码
IVisio.Shape shape = o as IVisio.Shape;
double width = shape.Cells["Width"]
.Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters];
double height = shape.Cells["Height"]
.Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters];
double pinX = shape.Cells["PinX"]
.Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters];
double pinY = shape.Cells["PinY"]
.Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters];
答案 0 :(得分:2)
返回与传入和传出连接相关联的形状的ID。
using Visio = Microsoft.Office.Interop.Visio;
visioObj = (Visio.Application)
System.Runtime.InteropServices.Marshal.GetActiveObject("Visio.Application");
Array ids = shape.ConnectedShapes(Visio.VisConnectedShapesFlags
.visConnectedShapesAllNodes, "");
// Using first item and get name
string name = visioObj.ActivePage.Shapes[ids.GetValue(0)].Name;
答案 1 :(得分:0)
要查找容器关系,可以使用此方法使用API:
public class ShapeWrapper
{
public IVisio.Shape Shape { get; set; }
private List<ShapeWrapper> children = new List<ShapeWrapper>();
public List<ShapeWrapper> Children { get { return this.children; } }
public ShapeWrapper(IVisio.Shape shape)
{
Shape = shape;
}
}
private void FindChildren(ShapeWrapper shapeWrapper,
List<IVisio.Shape> addedShapes)
{
IVisio.Selection children = shapeWrapper
.Shape.SpatialNeighbors[
(short)IVisio.VisSpatialRelationCodes.visSpatialContain,
0,
(short)IVisio.VisSpatialRelationFlags.visSpatialFrontToBack];
foreach (IVisio.Shape child in children)
{
if (!addedShapes.Contains(child))
{
//MessageBox.Show(child.Text);
ShapeWrapper childWrapper = new ShapeWrapper(child);
shapeWrapper.Children.Add(childWrapper);
FindChildren(childWrapper, addedShapes);
}
}
}
答案 2 :(得分:-1)
使用PackagePart的数据创建XML文档。您需要特别注意管理您创建的特定XML文档类型的模式的XML命名空间。 您创建一个新文件以包含XML并将文件保存到Package中的某个位置。 您在新的PackagePart和Package或其他PackagePart对象之间创建必要的关系。 您更新需要引用新零件的任何现有零件。例如,如果向文件添加新的“页面内容”部分(新页面),则还需要更新“页面索引”部分(/visio/pages/pages.xml文件)以包含有关新页面的正确信息。