仅限使用矩形图案
Visio图说明:单位mm(毫米),坐标原点位于左下角
将Visio文件拖动到主窗体后自动加载
using Microsoft.Office.Interop.Visio;
using Application = Microsoft.Office.Interop.Visio.Application;
using Color = System.Drawing.Color;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Application visioApp;
private Document visioDocument;
private void Form1_DragEnter(object sender, DragEventArgs e)
{
// 检查拖放的数据是否包含文件
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy; // 允许拖放
}
else
{
e.Effect = DragDropEffects.None; // 不允许拖放
}
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
// 获取拖放的文件路径
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length > 0)
{
string visioFilePath = files[0];
// 加载 Visio 文件
List<VisioShapeInfo> list = GetShapesInfo(visioFilePath);
load(list);
// 在这里可以进行其他处理,例如显示 Visio 图形信息等
}
}
public List<VisioShapeInfo> GetShapesInfo(string visioFilePath)
{
List<VisioShapeInfo> shapesInfo = new List<VisioShapeInfo>();
// 创建 Visio 应用程序
Application visioApp = new Application();
// 打开 Visio 文档
Document document = visioApp.Documents.Open(visioFilePath);
// 获取第一个页面
Page page = document.Pages[1];
// 获取页面的大小
double pageWidth = page.PageSheet.get_Cells("PageWidth").Result[VisUnitCodes.visMillimeters];
double pageHeight = page.PageSheet.get_Cells("PageHeight").Result[VisUnitCodes.visMillimeters];
panel1.Width = Convert.ToInt32((pageWidth * 96 / 25.4)); //从毫米换算成像素
panel1.Height = Convert.ToInt32((pageHeight * 96 / 25.4));
panel1.BorderStyle = BorderStyle.FixedSingle;
// 遍历页面中的所有形状
foreach (Shape shape in page.Shapes)
{
// 获取Shape的文本
string shapeText = shape.Text;
double shapeX = shape.Cells["PinX"].Result[VisUnitCodes.visMillimeters];
double shapeY = shape.Cells["PinY"].Result[VisUnitCodes.visMillimeters];
double shapeWidth = shape.Cells["Width"].Result[VisUnitCodes.visMillimeters];
double shapeHeight = shape.Cells["Height"].Result[VisUnitCodes.visMillimeters];
// 将形状信息添加到列表中
shapesInfo.Add(new VisioShapeInfo
{
X = (float)(shapeX * 96 / 25.4),
Y = (float)(pageHeight * 96 / 25.4) - (float)(shapeY * 96 / 25.4), //窗体坐标原点为左上角,Visio图文件坐标点为左下角,所以反转一下
Width = (float)(shapeWidth * 96 / 25.4),
Height = (float)(shapeHeight * 96 / 25.4),
Text = shapeText
});
}
// 关闭 Visio 应用程序
visioApp.Quit();
return shapesInfo;
}
private void load(List<VisioShapeInfo> shapesInfo)
{
// 遍历形状信息列表,为每个形状创建 Label 控件并添加到 Panel 中
foreach (var shapeInfo in shapesInfo)
{
Label label = new Label();
label.AutoSize = false;
label.BorderStyle = BorderStyle.FixedSingle;
label.BackColor = Color.Red;
// 设置 Label 的文本、大小和位置
label.Text = shapeInfo.Text;
label.Size = new Size((int)shapeInfo.Width, (int)shapeInfo.Height);
label.Location = new Point((int)shapeInfo.X, (int)shapeInfo.Y);
// 文本居中显示
label.TextAlign = ContentAlignment.MiddleCenter;
// 添加 Label 控件到 Panel 中
panel1.Controls.Add(label);
}
}
}
public class VisioShapeInfo
{
public double X { get; set; }
public double Y { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public string Text { get; set; }
}
}