免费好用可快速开发的绘图软件,绘图编辑器+状态可配置化,支持各种状态图,后期免维护

浮云E绘图提供完整的SDK开发包,支持快速定制开发各类状态图、流程图、电子图纸、平面布局图等项目源码。支持状态数据定义可配置,后期免维护。

使用浮云E绘图开发流程:
1. 使用浮云E绘图编辑器(类似viso绘图)画静态图,并保存为本地绘图数据文件
2. 业务状态配置化,适应各类状态图,后期代码免修改
3. 新建第三方C#/VC等工程,集成FYDC.dll(参看Demo项目源码)
4. 调用API接口函数创建加载图形,关联业务对象,动态更新展示效果。

如下图工控采集状态图所示,根据实际的采集设备工作状态图形化实时展示。

 

1. 使用绘图编辑器画静态图,并保存数据文件

浮云绘图编辑器支持直线、多点线、矩形、椭圆、扇形、三角形、四角形、文字和图片基础图元。并支持基础图元之间灵活组合成复合模板图元。

编辑器详情参看:

浮云绘图CAD编辑器源码开发之直线、方块、圆等基础图元操作和接口定义

浮云E绘图SDK,快速开发电子图纸、逻辑电路图、工业控制图、工艺流程图等绘图项目

 

2. 业务数据定义配置化,支持各类状态图,后期无需开发代码

业务对象对应的图形可以是直线、多电线、矩形、圆、三角形、扇形、文字、图片等图元,这个图元有各自的属性值,根据不同的属性值有不同的绘图展示效果。如下图所示矩形图元的属性项,我们可以把需要修改的属性组合成某种状态的展示形式。

 

 

 如在下图中间所示,修改矩形线条宽度和颜色;下图右侧图所示,修改矩形填充颜色,即可表示不同的状态的不同图形展示效果。

浮云E绘图矩形图元属性值修改

 本Demo设计了一个比较通用的状态配置定义文件示例,如下所示。

一般线条,在初始绘图基础上通过修改线的颜色、(宽度)、虚实风格表示不同状态。如电路断开可用虚线或者红颜色线,未知状态可用用灰色线等。

一般块类(矩形、圆、三角形、扇形中间区域),在初始绘图基础上,可用控制填充颜色以及是否填充。块类图元的边框也是线条,属性也可以控制。

我们可以定义【状态图配置示例.txt】如下所示:

;;线类型名:状态数N;状态0颜色值,线宽,虚实;状态1颜色值,线宽,虚实......状态N颜色值,线宽,虚实
LT1:3;12632256,1,0;65280,1,0;255,3,0
LT2:5;12632256,1,1;65280,2,0;255,2,0;16711680,2,0;16711935,1,0 

;;块类型名:状态数N;状态0是否填充,填充颜色;状态1是否填充,填充颜色......状态N是否填充,填充颜色
AT1:2;0,0;1,65280
AT2:5;0,0;1,65280;1,255;1,16711680;16711935,1

此配置文件定义可以用在多个项目里。有不同的业务状态需要,也可以丰富定义。真正的做到后续状态项目之需要编辑器画图+定义配置文件即可,而不需要开发/修改软件代码(更不需要重新发布安装软件)。

“LT2:5;12632256,1,1;65280,2,0;255,2,0;16711680,2,0;16711935,1,0”的具体意义是:线类状态LT2有5种状态,线条灰色(12632256==GRG(C0,C0,C0))-线宽1-虚线(1);线条绿色(65280==GRG(0,FF,00))-线宽2-实线(0)......

定义好了业务状态及其展示效果配置文件,在使用浮云绘图编辑器画图时,只需要把业务属性(标识Title)设为LT2,此图元即有了5种状态。另外业务系统通过业务属性(名称Name)与该图元关联,实时更新状态值5态(0~4),即可以按定义动态更新此图元的展示效果。

  

namespace FYEDrawDemo_Senior
{
    public abstract class BaseStatus 
    {
        public String TypeName { set; get; }
        public int StatusCount { set; get; }
        public abstract void AddStatus(string sParam, char separator);

        public abstract void SetStatus(FYECMDCView dcView, ShapeElement shape, int status);

        public abstract void Clear();
    }
    public class BaseParam { }
    public class LineParam : BaseParam
    {
        public int Color { set; get; }
        public int Width { set; get; }
        public int Style { set; get; }

        public LineParam(int color, int width, int style)
        {
            this.Color = color;
            this.Width = width;
            this.Style = style;
        }
    }
    public class AreaParam : BaseParam
    {
        public int Fill { set; get; }
        public int Color { set; get; }

        public AreaParam(int fill, int color)
        {
            this.Fill = fill;
            this.Color = color;
        }
    }
    public class CompParam : BaseParam
    {
        public int LineColor { set; get; }
        public int LineWidth { set; get; }
        public int LineStyle { set; get; }
        public int FillColor { set; get; }

        public CompParam(int lineColor,int lineWidth, int lineStyle, int fillColor)
        {
            this.LineColor = lineColor;
            this.LineWidth = lineWidth;
            this.LineStyle = lineStyle;
            this.FillColor = fillColor;
        }
    }

    public class LineStatus : BaseStatus
    {
        private List<LineParam> staList = new List<LineParam>();
        public List<LineParam> StatusList { get { return staList; } }

        public override void AddStatus(string sParam, char separator)
        {//状态0颜色值,线宽,虚实
            int color;
            int width;
            int style;
            string[] arr = sParam.Split(separator);
            Debug.Assert(arr.Length == 3);

            color = int.Parse(arr[0]);
            width = int.Parse(arr[1]);
            style = int.Parse(arr[2]);

            LineParam param = new LineParam(color, width, style);
            staList.Add(param);

        }

        public override void SetStatus(FYECMDCView dcView, ShapeElement shape, int status)
        {
            dcView.SetLineColor(shape, staList[status].Color);
            dcView.SetLineWidth(shape, staList[status].Width);
            dcView.SetLineStyle(shape, staList[status].Style);
        }

        public override void Clear()
        {
            staList.Clear();
        }
    }
    public class AreaStatus : BaseStatus
    {
        private List<AreaParam> staList = new List<AreaParam>();
        public List<AreaParam> StatusList { get { return staList; } }

        public override void AddStatus(string sParam, char separator)
        {//状态0是否填充,填充颜色
            int fill;
            int color;    
            string[] arr = sParam.Split(separator);
            Debug.Assert(arr.Length == 2);

            fill = int.Parse(arr[0]);
            color = int.Parse(arr[1]);

            AreaParam param = new AreaParam(fill, color);
            staList.Add(param);
        }

        public override void SetStatus(FYECMDCView dcView, ShapeElement shape, int status)
        {
            dcView.SetIsFill(shape, staList[status].Fill);
            dcView.SetFillColor(shape, staList[status].Color);
        }

        public override void Clear()
        {
            staList.Clear();
        }
    }

    public class CompStatus:BaseStatus
    {
        private List<CompParam> staList = new List<CompParam>();
        public List<CompParam> StatusList { get { return staList; } }

        public override void AddStatus(string sParam, char separator)
        {//状态0是否填充,填充颜色
            int lColor;
            int lWidth;
            int lStyle;
            int fColor;
            string[] arr = sParam.Split(separator);
            Debug.Assert(arr.Length == 4);

            lColor = int.Parse(arr[0]);
            lWidth = int.Parse(arr[1]);
            lStyle = int.Parse(arr[2]);
            fColor = int.Parse(arr[3]);

            CompParam param = new CompParam(lColor,lWidth,lStyle, fColor);
            staList.Add(param);
        }

        public override void SetStatus(FYECMDCView dcView, ShapeElement shape, int status)
        {
            dcView.SetLineColor(shape, staList[status].LineColor);
            dcView.SetLineWidth(shape, staList[status].LineWidth);
            dcView.SetLineStyle(shape, staList[status].LineStyle);
            dcView.SetFillColor(shape, staList[status].FillColor);
        }

        public override void Clear()
        {
            staList.Clear();
        }
    }
    public class StatusCfg
    {
        private List<BaseStatus> staList = new List<BaseStatus>();
        public List<BaseStatus> StatusList { get { return staList; } }

        public void Load(string fileName)
        {
            var file = File.Open(Environment.CurrentDirectory + "\\"+ fileName, FileMode.Open);
            List<string> txtRows = new List<string>();
            using (var stream = new StreamReader(file,System.Text.Encoding.GetEncoding("utf-8")))
            {
                while(!stream.EndOfStream)
                {
                    txtRows.Add(stream.ReadLine());
                }
            }
            file.Close();

            //;;线类型名:状态数N;状态0颜色值,线宽,虚实;状态1颜色值,线宽,虚实......状态N颜色值,线宽,虚实
            //LT1:3;12632256,1,0;65280,1,0;255,1,0
            //LT2:5;12632256,1,1;65280,2,0;255,2,0;16711680,2,0;16711935,1,0 

            //;;块类型名:状态数N;状态0是否填充,填充颜色;状态1是否填充,填充颜色......状态N是否填充,填充颜色
            //AT1:2;0,0;1,65280
            //AT2:5;0,0;1,65280;1,255;116711680;16711935,1

            //;;类型名称: 状态数;状态0线颜色,线宽度,填充颜色;状态1线颜色,线宽度,填充颜色......
            //CMT1:3;12632256,1,0;65280,1,0,0,0;255,1,0
            //CMT2:5;12632256,1,0;65280,1,0;255,1,0;16711680,2,12632256;16711935,2,65280
            foreach (string row in txtRows)
            {
                if (row.Length < 2 || row.StartsWith(";;")) continue;

                string[] str1 = row.Split(':');
                string typeName = str1[0];
                string str2 = str1[1];

                string[] str3 = str2.Split(";");
                int count = int.Parse(str3[0]);
                Debug.Assert(str3.Length>=count+1);

                BaseStatus sta = null;
                if(typeName.Contains("LT"))
                {
                    sta = new LineStatus();
                }
                else if(typeName.Contains("AT"))
                {
                    sta = new AreaStatus();
                }
                else if(typeName.Contains("CMT"))
                {
                    sta = new CompStatus();
                }
                for (int i = 0; i < count; i++)
                {
                    string sp = str3[1 + i];
                    sta.AddStatus(sp, ',');
                }
                sta.TypeName = typeName;
                sta.StatusCount = count;
                staList.Add(sta);
            }
        }

        public void SetStatus(FYECMDCView dcView, ShapeElement shape, int status)
        {
            foreach(BaseStatus sta in staList)
            {
                if(sta.TypeName == shape.Title)
                {
                    sta.SetStatus(dcView, shape, status);
                }
            }
        }

        public void Clear()
        {
            foreach(BaseStatus bs in staList)
            {
                bs.Clear();
            }
            staList.Clear();
        }
    }
}

 

3. 创建业务工程项目,集成绘图组件DLL

创建自己的业务工程项目,引入绘图组件:

A. 拷贝FYEDC.dll到exe目录下

B. 然后复制FYEDC.cs文件里的浮云绘图DLL接口函数列表到自己工程文件,即可调用。

(注意,需要设置项目平台为x86)

浮云E绘图工程项目集成绘图组件DLL

 

4. 使用API操作图元,并动态更新状态

 A. 可自己封装C#绘图操作类,如下所示:

    public class FYEDCView
    {
        private IntPtr hShapeCanvas = IntPtr.Zero;
        private Panel panel = null;
        private List<ShapeElement> shapeElementList;

        public void Create(Panel panel)
        {
            this.panel = panel;
            hShapeCanvas = IFYDC.NewFYEDC();
            IFYDC.CreateFYEDC(hShapeCanvas, panel.Handle,0,0, panel.Width, panel.Height);
        }
        public void Release()
        { 
            if(hShapeCanvas != null)
            {
                shapeElementList.Clear();
                IFYDC.DeleteFYEDC(hShapeCanvas);
                hShapeCanvas = IntPtr.Zero;
            }
        }
        public bool Open(String fileName)
        {
            IFYDC.LoadShapes(hShapeCanvas, fileName);

            int virBackColor = IFYDC.GetBackColor(hShapeCanvas);
            IFYDC.SetNoClientColor(hShapeCanvas, virBackColor);

            return true;
        }

        ......
        ......
     }

B. 加载状态定义配置文件

完整代码在上面第2节。​

 

 注意,本Demo绘图时,只给第1个采集柜的第1行图元设置了AT1状态定义,给第2机柜的第1行图元设置了AT2状态定义。其他未设置,大家可以自行设置,也可以修改状态配置文件,查看效果。

 

C. 绘图数据,具体源码参考Demo工程

D. 根据业务对象状态,以及状态配置,动态刷新图形

        private Random rand = new Random();
        private void timer1_Tick(object sender, EventArgs e)
        {
            //实际情况是有一套业务系统和绘图系统,本项目是绘图系统。画的图元都是业务系统存在的业务对象,实时状态数据也是来自业务系统。
            //此Demo不构建完整的业务系统,直接随机改变绘图系统状态值,从而更新绘图的线条、区域、文字等展示效果
            List<ShapeElement> shapes = cmdcView.GetShapeList();
            List<BaseStatus> statuss = staCfg.StatusList;
            foreach (ShapeElement shape in shapes)
            {
                foreach(BaseStatus sta in statuss)
                {
                    if(shape.Title == sta.TypeName)
                    {
                        //实际情况浮云绘图编辑器画图配置的状态数据是由业务系统的业务对象状态数决定的
                        //此Demo仅演示绘图系统不构建完整的业务系统,此处的图元实时状态值直接从图元可用状态数随机
                        int curStatus = rand.Next(sta.StatusCount);
                        if(curStatus != shape.Status)
                        {
                            shape.Status = curStatus;
                            staCfg.SetStatus(cmdcView, shape, curStatus);
                        }
                    }
                }
            }
        }

大家可以下载本案例工程源码,有完整的DLL接口函数再次封装、配置文件定义、配置文件加载和数据关联、定制更新状态和图形展示形态等功能模块。

浮云E绘图高级Demo_业务配置化_复合图元动态更新.zip

浮云E绘图,既支持类似viso、亿图画图(绘制静态图形),更支持快速二次开发,关联业务对象,实时更新各线、块、文字、图片的状态,可通过配置状态定义txt文件,支持各类绘图项目的免代码开发和维护。如有更特殊的需要,可以驻场定制开发。

浮云E绘图SDK3.2海量绘图模板,简单好用。支持快速开发状态图、电路原理图、平面布局图源码-图像处理文档类资源-CSDN下载

posted @ 2022-06-20 17:10  浮云绘图  阅读(489)  评论(0)    收藏  举报