将Visio图中的图形转移到Winform中

发布时间:2024年01月04日

仅限使用矩形图案

效果:

在这里插入图片描述
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; }
    }
}

文章来源:https://blog.csdn.net/weixin_46139477/article/details/135386731
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。