C#开发AGV地图编辑软件

这篇具有很好参考价值的文章主要介绍了C#开发AGV地图编辑软件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#自己开发AGV地图编辑软件:

1、自由添加和删除站点、停车位、小车、运行路径。

2、编辑得地图以XML文件保存。

3、导入编辑好地图的XML文件。

4、程序都是源码,可以直接在此基础上进行二次开发。

下载链接:https://download.csdn.net/download/panjinliang066333/88855372

C#开发AGV地图编辑软件,C#,c#,开发语言,AGV,地图编辑器

C#开发AGV地图编辑软件,C#,c#,开发语言,AGV,地图编辑器

C#开发AGV地图编辑软件,C#,c#,开发语言,AGV,地图编辑器

部分代码展示:文章来源地址https://www.toymoban.com/news/detail-834635.html

#region 限制闪屏
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_MINIMIZEBOX = 0x00020000;  // Winuser.h中定义   
                CreateParams cp = base.CreateParams;
                cp.Style = cp.Style | WS_MINIMIZEBOX;   // 允许最小化操作
                return cp;
            }
        }
        #endregion

        NodeType newType = NodeType.MousePick;
        MapPanel mapPanelDocker;
        FloydHelper floydCurrent;

        #region AGV配置信息
        int AGVCount = 0;
        object[] lockObj;//线程间锁
        MapVehicle[] myAgvModel;
        //---占据的单元
        Dictionary<string, string> LockUnit = new Dictionary<string, string>();
        #endregion
        #region 画布属性
        private int maxScale = 0; //X轴最大刻度
        private static int AxisOffset = 32;//X轴的Y坐标偏移量
        private Font font = new Font("宋体", 9F, FontStyle.Regular); //刻度值显示字体
        bool showRule = true;
        bool showNetLine = true;

        public static int MonitorDPI = 12;//单位内像素点 
        public static float scaling = 1.0F; //缩放比例
        #endregion
        #region 变量
        #region 其他窗体
        frm_ModelProperty frm_Property;
        #endregion
        #endregion

        #region 其他窗体
        LoadingForm loadForm;
        #endregion
        #region 窗体初始化
        #region 初始化
        public frm_AGVMain()
        {
            InitializeComponent();
            loadForm = new LoadingForm();
            loadForm.ShowLoadingDealy(3);
            mapPanelDocker = new MapPanel();
            mapPanelDocker.Size = this.pnlMap.Size;
            mapPanelDocker.Location = new Point(0, 0);
            mapPanelDocker.BorderStyle = BorderStyle.FixedSingle;
            mapPanelDocker.MouseClick += mapPanel1_MouseClick;
            mapPanelDocker.MouseMove += mapPanelDocker_MouseMove;
            mapPanelDocker.MouseLeave += mapPanelDocker_MouseLeave;
            this.pnlMap.Controls.Add(mapPanelDocker);
            mapPanelDocker.LinePropertySelect += MapPanelDocker_LinePropertySelect;
            mapPanelDocker.MapNodePropertySelect += MapPanelDocker_CirclePropertySelect;
            mapPanelDocker.BezierLinePropertySelect += MapPanelDocker_BezierLinePropertySelect;
            mapPanelDocker.BlockPropertySelect += mapPanelDocker_BlockPropertySelect;
            mapPanelDocker.IsLine = newType == NodeType.DirectLineCap; ;
            mapPanelDocker.IsBezierLine = newType == NodeType.BezierLineCap;
            InitialControlsOptions();
            InitialTreeViewLayout();
        }
        #endregion
        #region 初始化加载控件属性
        private void InitialControlsOptions()
        {
            newType = NodeType.MousePick;
            this.btn_鼠标.Enabled = false;
            foreach (Control item in this.panel8.Controls)
            {
                if (item.GetType() == typeof(Button))
                {
                    Button btn = (Button)item;
                    if (btn.Name.Contains("_"))
                    {
                        btn.Click += btnAll_Click;
                    }
                }
            }
        }
        #endregion
        #region 鼠标箭头/站点、停车点......点击
        private void btnAll_Click(object sender, EventArgs e)
        {
            foreach (Control item in this.panel8.Controls)
            {
                if (item.GetType() == typeof(Button))
                {
                    Button btnTemp = (Button)item;
                    if (btnTemp.Name.Contains("_"))
                    {
                        btnTemp.Enabled = true;
                    }
                }
            }
            Button btn = (Button)sender;
            string strTemp = btn.Name.Split('_')[1];
            switch (strTemp)
            {
                case "鼠标":
                default:
                    newType = NodeType.MousePick;
                    this.btn_鼠标.Enabled = false;
                    break;
                case "站点":
                    newType = NodeType.StationNode;
                    this.btn_站点.Enabled = false;
                    break;
                case "停车点":
                    newType = NodeType.ParkingStationNode;
                    this.btn_停车点.Enabled = false;
                    break;
                case "直线箭头":
                    newType = NodeType.DirectLineCap;
                    this.btn_直线箭头.Enabled = false;
                    break;
                case "曲线箭头":
                    newType = NodeType.BezierLineCap;
                    this.btn_曲线箭头.Enabled = false;
                    break;
                case "块":
                    newType = NodeType.Block;
                    break;
                case "车":
                    newType = NodeType.Vehicle;
                    break;
            }
            mapPanelDocker.IsLine = newType == NodeType.DirectLineCap;
            mapPanelDocker.IsBezierLine = newType == NodeType.BezierLineCap;
        }
        #endregion
        #region 树状展开添加Layout
        private void InitialTreeViewLayout()
        {
            this.treeviewLayout.Nodes.Clear();
            TreeNode tn_origine = new TreeNode();
            tn_origine.Text = "Layout VLayout-01";
            tn_origine.ToolTipText = tn_origine.Text;
            this.treeviewLayout.Nodes.Add(tn_origine);
            AGV_Point[] allPoints = ReadXmlFile.ReadAllPoint(GlobalSystemConfig.Instance.AgvConfigPath);
            if (allPoints != null)
            {
                #region 添加所有的点
                TreeNode tn_sub = new TreeNode();
                tn_sub.Text = "Points";
                tn_sub.ToolTipText = tn_sub.Text;
                tn_origine.Nodes.Add(tn_sub);
                for (int i = 0; i < allPoints.Length; i++)
                {
                    TreeNode tn_child = new TreeNode();
                    tn_child.Text = "Point   " + allPoints[i]._Name;
                    tn_child.ToolTipText = tn_child.Text;
                    tn_sub.Nodes.Add(tn_child);//二级菜单
                }
                #endregion
            }
            AGV_Line[] allLines = ReadXmlFile.ReadAllLine(GlobalSystemConfig.Instance.AgvConfigPath);
            if (allLines != null)
            {
                #region 添加所有的路径
                TreeNode tn_sub = new TreeNode();
                tn_sub.Text = "Paths";
                tn_sub.ToolTipText = tn_sub.Text;
                tn_origine.Nodes.Add(tn_sub);
                for (int i = 0; i < allLines.Length; i++)
                {
                    TreeNode tn_child = new TreeNode();
                    tn_child.Text = "Path   " + allLines[i].LineName;
                    tn_child.ToolTipText = tn_child.Text;
                    tn_sub.Nodes.Add(tn_child);//二级菜单
                }
                #endregion
            }
            AGV_Block[] allBlocks = ReadXmlFile.ReadAllBlock(GlobalSystemConfig.Instance.AgvConfigPath);
            if (allBlocks != null)
            {
                #region 添加所有的块
                TreeNode tn_sub = new TreeNode();
                tn_sub.Text = "Blocks";
                tn_sub.ToolTipText = tn_sub.Text;
                tn_origine.Nodes.Add(tn_sub);
                for (int i = 0; i < allBlocks.Length; i++)
                {
                    TreeNode tn_child = new TreeNode();
                    tn_child.Text = "Block   " + allBlocks[i].BlockName;
                    tn_child.ToolTipText = tn_child.Text;
                    tn_child.ContextMenuStrip = this.menuBlock;
                    tn_sub.Nodes.Add(tn_child);//二级菜单
                    string[] strArr = allBlocks[i].menbers.Split(',');
                    for (int j = 0; j < strArr.Length; j++)
                    {
                        AGV_Line lineTemp = null;
                        for (int k = 0; k < allLines.Length; k++)
                        {
                            if (allLines[k].LineName == strArr[j])
                            {
                                lineTemp = allLines[k];
                                break;
                            }
                        }
                        if (lineTemp != null)
                        {
                            TreeNode tn_childchild = new TreeNode();
                            tn_childchild.Text = "Path   " + lineTemp.LineName;
                            tn_childchild.ToolTipText = tn_childchild.Text;
                            tn_child.Nodes.Add(tn_childchild);//三级菜单
                        }
                    }
                }
                #endregion
            }
            this.treeViewVehicle.Nodes.Clear();
            tn_origine = new TreeNode();
            tn_origine.Text = "Layout Vehicles";
            tn_origine.ToolTipText = tn_origine.Text;
            this.treeViewVehicle.Nodes.Add(tn_origine);

            mapPanelDocker.OpenMap(GlobalSystemConfig.Instance.AgvConfigPath);
            this.treeviewLayout.ExpandAll();
            this.treeViewVehicle.ExpandAll();
        }
        #region 添加子节点时
        public void TreeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
            Font rootFont = new Font("微软雅黑", 9F, FontStyle.Bold);
            Font childFont = new Font("微软雅黑", 9F);

            Brush foreBrush = new SolidBrush(Color.FromArgb(81, 81, 81));
            Brush recBrush = new SolidBrush(Color.FromArgb(82, 218, 163));
            Brush recSelectedBrush = new SolidBrush(Color.FromArgb(248, 248, 255));

            Pen recPen = new Pen(new SolidBrush(Color.FromArgb(226, 226, 226)));
            Pen recHoverPen = new Pen(new SolidBrush(Color.FromArgb(82, 218, 163)));
            Pen linePen = new Pen(Color.Gray);
            linePen.DashStyle = DashStyle.Dot;

            Image icon;
            if (e.Node.Level == 0)//根节点
            {
                #region 绘制根节点
                icon = Resources.布局图;
                if (e.Node.Text.Contains("Vehicles"))
                {
                    icon = Resources.ziyuan;
                }
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(227, 251, 244)), e.Bounds);
                e.Graphics.DrawImage(icon, e.Node.Bounds.X - 20, e.Node.Bounds.Y + 5);
                e.Graphics.DrawString(e.Node.Text, rootFont, foreBrush, e.Node.Bounds.Left + 10, e.Node.Bounds.Top + 5);
                #endregion
            }
            else if (e.Node.Level == 1)
            {
                #region 一级子节点
                if (!e.Bounds.IsEmpty)
                {
                    Point start = new Point(e.Node.Bounds.X, e.Node.Bounds.Y + 15);
                    Point middle = new Point(e.Node.Bounds.X - 30, e.Node.Bounds.Y + 15);
                    Point topEnd = new Point(e.Node.Bounds.X - 30, e.Node.Bounds.Y);
                    Point bottomEnd = new Point(e.Node.Bounds.X - 30, e.Node.Bounds.Y + 30);
                    e.Graphics.DrawLine(linePen, start, middle);
                    e.Graphics.DrawLine(linePen, middle, topEnd);
                    if (null != e.Node.NextNode)
                    {
                        e.Graphics.DrawLine(linePen, middle, bottomEnd);
                    }

                    #region 重绘图标
                    if (!e.Node.IsExpanded)
                    {
                        icon = Resources.plus;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 25, e.Node.Bounds.Y + 8);

                        icon = Resources.wenjianjia__2_;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 10, e.Node.Bounds.Y + 8);
                    }
                    else
                    {
                        icon = Resources.jianhao_1;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 25, e.Node.Bounds.Y + 8);

                        icon = Resources.wenjianjia__2_;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 10, e.Node.Bounds.Y + 8);
                    }
                    #endregion

                    Rectangle box = new Rectangle(e.Bounds.Left + 60, e.Bounds.Top + 4, this.Width - 60 - 25, e.Bounds.Height - 8);
                    if (e.Node.IsSelected)//二级节点被选中
                    {
                        e.Graphics.FillRectangle(recBrush, box);
                    }
                    e.Graphics.DrawString(e.Node.Text, childFont, foreBrush, e.Node.Bounds.Left + 15, e.Node.Bounds.Top + 6);
                }
                #endregion
            }
            else
            {
                #region 二级子节点
                if (!e.Bounds.IsEmpty)
                {
                    Point start = new Point(e.Node.Bounds.X + 5, e.Node.Bounds.Y + 15);
                    Point middle = new Point(e.Node.Bounds.X - 20, e.Node.Bounds.Y + 15);
                    Point topEnd = new Point(e.Node.Bounds.X - 20, e.Node.Bounds.Y);
                    Point bottomEnd = new Point(e.Node.Bounds.X - 20, e.Node.Bounds.Y + 30);
                    e.Graphics.DrawLine(linePen, middle, topEnd);//|
                    e.Graphics.DrawLine(linePen, start, middle);//--
                    if (null != e.Node.NextNode)
                    {
                        e.Graphics.DrawLine(linePen, middle, bottomEnd);
                    }

                    Rectangle box = new Rectangle(e.Bounds.Left + 65, e.Bounds.Top + 4, this.Width - 55 - 25, e.Bounds.Height - 8);
                    if (e.Node.Text.StartsWith("Point"))
                    {
                        icon = Resources.icon_test;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 15, e.Node.Bounds.Y + 8);
                    }
                    else if (e.Node.Text.StartsWith("Path"))
                    {
                        icon = Resources.quxian;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 15, e.Node.Bounds.Y + 8);
                    }
                    else if (e.Node.Text.StartsWith("Block"))
                    {
                        icon = Resources.icon_block;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 15, e.Node.Bounds.Y + 8);
                    }
                    else if (e.Node.Text.StartsWith("Vehicle"))
                    {
                        icon = Resources.ziyuan;
                        e.Graphics.DrawImage(icon, e.Node.Bounds.X - 15, e.Node.Bounds.Y + 8);
                    }
                    if (e.Node.IsSelected)//二级节点被选中
                    {
                        e.Graphics.FillRectangle(recBrush, box);
                        e.Graphics.DrawString(e.Node.Text, childFont, recSelectedBrush, e.Node.Bounds.Left + 10, e.Node.Bounds.Top + 6);
                    }
                    else
                    {
                        if ((e.State & TreeNodeStates.Hot) != 0)//鼠标指针在二级节点上
                        {
                            e.Graphics.DrawRectangle(recHoverPen, box);
                        }
                        else
                        {
                            e.Graphics.DrawRectangle(recPen, box);
                        }
                        e.Graphics.DrawString(e.Node.Text, childFont, foreBrush, e.Node.Bounds.Left + 10, e.Node.Bounds.Top + 6);
                    }
                }
                #endregion
            }
        }
        #endregion
        #endregion
        #region 画标尺和网格
        /// <summary>
        /// 画标尺和网格
        /// </summary>
        /// <param name="showRule"></param>
        /// <param name="showNetLine"></param>
        /// <returns></returns>
        private Bitmap PaintRulesAndLine(bool showRule, bool showNetLine)
        {
            Bitmap bit = new Bitmap(this.Width * 4, this.Height * 4);
            Graphics g = Graphics.FromImage(bit);

            int widthInmm = bit.Width;
            int heightInmm = bit.Height;
            Pen p = new Pen(Color.Black, 1.5F);
            if (showRule)
            {
                #region 绘制X轴标尺
                for (int i = 0; i <= widthInmm / MonitorDPI * scaling; i++)//标尺总数
                {
                    float x = MonitorDPI * scaling * i + AxisOffset;
                    PointF start = new PointF(x, AxisOffset);
                    PointF end = new PointF(x, AxisOffset - 3);
                    if (i % 5 == 0)
                    {
                        end = new PointF(x, AxisOffset - 6);
                    }
                    if (i % 10 == 0)
                    {
                        end = new PointF(x, AxisOffset - 13);
                        PointF pStrPoint = i == 0 ? new PointF(x - 3, AxisOffset - 25) : new PointF(x - 10, AxisOffset - 25);
                        g.DrawString((i * 100).ToString(), font, Brushes.Black, pStrPoint);
                    }
                    g.DrawLine(Pens.Black, start, end);
                }
                #endregion

                Brush bBlack = Brushes.Black;

                #region 绘制y轴标尺
                for (int i = 0; i <= heightInmm / MonitorDPI * scaling; i++)
                {
                    float y = MonitorDPI * scaling * i + AxisOffset;
                    PointF start = new PointF(AxisOffset, y);
                    PointF end = new PointF(AxisOffset - 3, y);
                    if (i % 5 == 0)
                    {
                        end = new PointF(AxisOffset - 6, y);
                    }
                    if (i % 10 == 0)
                    {
                        end = new PointF(AxisOffset - 12, y);
                        PointF pStrPoint = i == 0 ? new PointF(AxisOffset - 20, y - 5) : new PointF(AxisOffset - 32, y - 12);
                        g.DrawString((i * 100).ToString(), font, bBlack, pStrPoint);
                    }
                    g.DrawLine(Pens.Black, start, end);
                }
                #endregion
            }

            if (showNetLine)
            {
                #region 绘制网格
                p = new Pen(Color.Gray, 1);
                p.DashStyle = DashStyle.Dot;
                for (int i = 0; i <= widthInmm / MonitorDPI; i++)//x方向网格
                {
                    g.DrawLine(p, AxisOffset, ((float)(MonitorDPI * i * scaling) + AxisOffset), widthInmm, ((float)(MonitorDPI * i * scaling) + AxisOffset));
                }
                for (int i = 0; i <= widthInmm / MonitorDPI; i++)//y方向网格
                {
                    g.DrawLine(p, ((float)(MonitorDPI * i * scaling) + AxisOffset), AxisOffset, ((float)(MonitorDPI * i * scaling) + AxisOffset), heightInmm);
                }
                #endregion
            }
            p = new Pen(Color.Black, 1);
            g.DrawLine(p, new PointF(AxisOffset, AxisOffset), new PointF(widthInmm, AxisOffset));
            g.DrawLine(p, new PointF(AxisOffset, AxisOffset), new PointF(AxisOffset, heightInmm));
            return bit;
        }
        #endregion
        #region 获得垂直的文本格式
        private string GetVString(string inStr)
        {
            string retStr = "";
            for (int i = 0; i < inStr.Length; i++)
            {
                retStr += inStr[i] + Environment.NewLine;
            }
            return retStr;
        }
        #endregion
        #endregion

        #region 窗体加载时
        private void frm_AGVMain_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }
        #endregion
                
        #region 绑定对应的属性窗口
        private void MapPanelDocker_CirclePropertySelect(MapNodeProperty mapStation)
        {
            propertyGridControl.SelectedObject = mapStation;
        }

        private void MapPanelDocker_LinePropertySelect(MapLineProperty mapLine)
        {
            propertyGridControl.SelectedObject = mapLine;
        }

        private void MapPanelDocker_BezierLinePropertySelect(MapBezierProperty mapBezierLine)
        {
            propertyGridControl.SelectedObject = mapBezierLine;
        }
        private void mapPanelDocker_BlockPropertySelect(MapBlockProperty mapBlock)
        {
            propertyGridControl.SelectedObject = mapBlock;
        }
        #endregion
        #region 获取临近标尺内的网格点
        public static Point GetNearRulePoint(Point p)
        {
            Point retP = p;
            int x = p.X;
            int y = p.Y;
            int intTempx = (int)((x - AxisOffset) / MonitorDPI / scaling);//在第几个网格
            int intTempy = (int)((y - AxisOffset) / MonitorDPI / scaling);//在第几个网格
            int singleRuleNetWidth = (int)(MonitorDPI * scaling);
            int locationX = AxisOffset + (int)((intTempx + 1) * MonitorDPI * scaling);
            int locationX1 = AxisOffset + (int)((intTempx) * MonitorDPI * scaling);
            int locationY = AxisOffset + (int)((intTempy + 1) * MonitorDPI * scaling);
            int locationY1 = AxisOffset + (int)((intTempy) * MonitorDPI * scaling);
            if (retP.X >= locationX1 + singleRuleNetWidth / 2)
            {
                retP.X = locationX;
            }
            else
            {
                retP.X = locationX1;
            }
            if (retP.Y >= locationY1 + singleRuleNetWidth / 2)
            {
                retP.Y = locationY;
            }
            else
            {
                retP.Y = locationY1;
            }
            return retP;
        }
        #endregion
        #region 转换成模型坐标
        /// <summary>
        /// 转成模型坐标
        /// </summary>
        /// <param name="pSourceLocation"></param>
        /// <returns></returns>
        private Point GetInFactLocation(Point pSourceLocation)
        {
            int x = pSourceLocation.X;
            int y = pSourceLocation.Y;
            if (x >= AxisOffset && y >= AxisOffset)
            {
                x = (int)((x - AxisOffset) / MonitorDPI / scaling * 100);
                y = (int)((y - AxisOffset) / MonitorDPI / scaling * 100);
            }
            Point pTemp = new Point(x, y);
            return pTemp;
        }
        #endregion

        #region 点击添加MapNode
        private void mapPanel1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;
            if (newType == NodeType.StationNode)
            {
                #region 如果是站点
                MapNode mapCircle = new MapNode();
                mapPanelDocker.Controls.Add(mapCircle);
                mapCircle.Name = "Point-" + GetMaxPointName();
                mapCircle.NameText = mapCircle.Name;
                mapCircle.OnNameChange += mapPanelDocker.mapCircle_OnNameChange;
                mapCircle.Left = e.X;
                mapCircle.Top = e.Y;
                mapCircle.Size = new Size(20, 20);
                mapCircle._type = "站点";
                mapCircle.Click += mapPanelDocker.MapCircle_Click;
                mapCircle.Focus();

                Label label1 = new Label();
                label1.BorderStyle = BorderStyle.None;
                label1.Name = mapCircle.Name;
                label1.BackColor = Color.Transparent;
                label1.Location = new Point((mapCircle).Location.X - 15, (mapCircle).Location.Y - 12);
                label1.ForeColor = mapPanelDocker.BackColor == Color.Black ? Color.White : Color.Black;
                label1.Text = mapCircle.Name;
                label1.AutoSize = true;
                label1.Visible = true;
                label1.BringToFront();
                mapPanelDocker.Controls.Add(label1);
                #endregion
            }
            else if (newType == NodeType.ParkingStationNode)
            {
                #region 停车点
                MapNode mapCircle = new MapNode();
                mapPanelDocker.Controls.Add(mapCircle);
                mapCircle.Name = "Point-" + GetMaxPointName();
                mapCircle.NameText = mapCircle.Name;
                mapCircle.OnNameChange += mapPanelDocker.mapCircle_OnNameChange;
                mapCircle.Left = e.X;
                mapCircle.Top = e.Y;
                mapCircle.Size = new Size(20, 20);
                mapCircle._type = "停车点";
                mapCircle.Click += mapPanelDocker.MapCircle_Click;
                mapCircle.Focus();

                Label label1 = new Label();
                label1.BorderStyle = BorderStyle.None;
                label1.Name = mapCircle.Name;
                label1.BackColor = Color.Transparent;
                label1.Location = new Point((mapCircle).Location.X - 15, (mapCircle).Location.Y - 12);
                label1.ForeColor = mapPanelDocker.BackColor == Color.Black ? Color.White : Color.Black;
                label1.Text = mapCircle.Name;
                label1.AutoSize = true;
                label1.Visible = true;
                label1.BringToFront();
                mapPanelDocker.Controls.Add(label1);
                #endregion
            }
            else
            {
                propertyGridControl.SelectedObject = new MapPanelProperty((MapPanel)sender);
            }
        }
        #endregion

        #region 获得一个临时的最大的站点名称
        /// <summary>
        /// 获得一个临时的最大的站点数字编号
        /// </summary>
        /// <returns></returns>
        private string GetMaxPointName()
        {
            List<string> pointListTemp = new List<string>();
            foreach (Control item in this.mapPanelDocker.Controls)
            {
                if (item.GetType() == typeof(MapNode))
                {
                    MapNode station = (MapNode)item;
                    string _Name = station.Name;
                    if (!pointListTemp.Contains(_Name))
                    {
                        pointListTemp.Add(_Name);
                    }
                }
            }
            for (int i = 0; i < pointListTemp.Count; i++)
            {
                if (pointListTemp[i] == null)
                {
                    pointListTemp.Remove(pointListTemp[i]);
                }
            }
            if (pointListTemp.Count == 0)
            {
                return "001";
            }
            else if (pointListTemp.Count == 1 && pointListTemp[0] == "")
            {
                return "001";
            }
            else
            {
                string maxPoint = pointListTemp.OrderBy(a => a.ToString()).Max();
                string strTemp = maxPoint.Split('-')[1];
                int intTemp2 = int.Parse(strTemp);
                return (intTemp2 + 1).ToString().PadLeft(3, '0');
            }
        }
        #endregion
        #region 获得一个最大的块的名称
        public string GetMaxBlockName()
        {
            AGV_Block[] allBlocks = XmlHelper.ReadXmlFile.ReadAllBlock(GlobalSystemConfig.Instance.AgvConfigPath);
            if (allBlocks != null && allBlocks.Length > 0)
            {
                string strTemp = allBlocks.Select(e => e.BlockName).Max();
                if (strTemp != "")
                {
                    int intTemp = int.Parse(strTemp.Replace("Block-", ""));
                    return (intTemp + 1).ToString().PadLeft(3, '0');
                }
                else
                {
                    return "001";
                }
            }
            return "001";
        }
        #endregion

        #region 定时器主线程
        private void timer1_Tick(object sender, EventArgs e)
        {
            #region 显示指针样式和时间
            string temp = "";
            switch (newType)
            {
                case NodeType.MousePick:
                default:
                    temp = "鼠标";
                    break;
                case NodeType.StationNode:
                    temp = "站点";
                    break;
                case NodeType.ParkingStationNode:
                    temp = "停车点";
                    break;
                case NodeType.DirectLineCap:
                    temp = "直线箭头";
                    break;
                case NodeType.BezierLineCap:
                    temp = "曲线箭头";
                    break;
                case NodeType.Block:
                    temp = "块";
                    break;
                case NodeType.Vehicle:
                    temp = "车";
                    break;
            }
            this.lb_NewType.Text = "当前选项:" + temp;
            this.lbTime.Text = DateTime.Now.ToString("yyyy-MM-dd  hh:mm:ss(ddd)");
            #endregion
        }
        #endregion



        #region 窗体关闭时
        private void frm_AGVMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dg = MessageBox.Show("Do you want to exit this Application?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            if (dg == DialogResult.OK)
            {
                try
                {
                    timer1.Stop();
                }
                catch
                {
                }
                finally
                {
                    loadForm = new LoadingForm();
                    loadForm.ShowLoadingDealy(2);
                    Application.ExitThread();
                    Application.Exit();//通知winform消息循环退出 在所有前台线程退出后退出应用 先停止线程 再终止线程
                    Environment.Exit(1);//直接终止所有线程,code为1即使有错误也直接终止 直接终止线程
                }
            }
            else
            {
                e.Cancel = true;
            }
        }
        #endregion
        #region 打开配置文件
        private void btn_打开文件_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = @"*.xml|*.xml";
            openFileDialog.InitialDirectory = GlobalSystemConfig.Instance.AppStartPath + @"\AppConfigDir\";
            if (openFileDialog.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }
            mapPanelDocker.OpenMap(openFileDialog.FileName);
            GlobalSystemConfig.Instance.AgvConfigPath = openFileDialog.FileName;
            InitialTreeViewLayout();
            floydCurrent = new FloydHelper();
        }
        #endregion
        #region 保存数据到xml文件
        private void bnt_保存_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = @"*.xml|*.xml";
            saveFileDialog.InitialDirectory = GlobalSystemConfig.Instance.AppStartPath + @"\AppConfigDir\";
            if (saveFileDialog.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }
            mapPanelDocker.SaveMap(saveFileDialog.FileName);
            XmlHelper.WriteXmlFile.UpdateModifiedDate(saveFileDialog.FileName);
            floydCurrent = new FloydHelper();
        }
        #endregion
        #region 上下左右
        private void btn_Left_Click(object sender, EventArgs e)
        {
            this.mapPanelDocker.Focus();
            this.btn_Left.Enabled = false;
            SendKeys.Send("{LEFT}");
            this.btn_Left.Enabled = true;
        }

        private void btn_up_Click(object sender, EventArgs e)
        {
            this.mapPanelDocker.Focus();
            this.btn_Left.Enabled = false;
            SendKeys.Send("{UP}");
            this.btn_Left.Enabled = true;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            this.mapPanelDocker.Focus();
            this.btn_Left.Enabled = false;
            SendKeys.Send("{DOWN}");
            this.btn_Left.Enabled = true;
        }

        private void btn_right_Click(object sender, EventArgs e)
        {
            this.mapPanelDocker.Focus();
            this.btn_Left.Enabled = false;
            SendKeys.Send("{RIGHT}");
            this.btn_Left.Enabled = true;
        }
        #endregion
        #region 鼠标移入移出显示坐标
        private void mapPanelDocker_MouseMove(object sender, MouseEventArgs e)
        {
            this.lbLocation.Text = "X:" + e.Location.X.ToString() + "、Y:" + e.Location.Y.ToString();
        }

        private void mapPanelDocker_MouseLeave(object sender, EventArgs e)
        {
            this.lbLocation.Text = "";
        }
        #endregion
        #region treeView选中某一项时
        private void treeviewLayout_AfterSelect(object sender, TreeViewEventArgs e)
        {
            TreeNode tn = e.Node;
            if (tn != null)
            {
                if (tn.Text != "")
                {
                    if (tn.Text.StartsWith("Path"))
                    {
                        this.mapPanelDocker.AddSelectLine(tn.Text);
                    }
                    else if (tn.Text.StartsWith("Point"))
                    {
                        this.mapPanelDocker.AddSelectStation(tn.Text);
                    }
                    else if (tn.Text.StartsWith("Block"))
                    {
                        this.mapPanelDocker.AddSelectBlck(tn.Text);
                    }
                }
            }
        }
        #endregion
        #region 添加或者删除一条路径到Block
        #region 添加
        private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mapPanelDocker.SelectMapline != null || mapPanelDocker.SelectMapBezierline != null)
            {
                string strBlockName = this.treeviewLayout.SelectedNode.Text.Replace(" ", "").Replace("BlockBlock", "Block");
                string lineName = "";
                string BezierLineName = "";
                if (mapPanelDocker.SelectMapline != null)
                {
                    lineName = mapPanelDocker.SelectMapline.LineName;
                }
                if (mapPanelDocker.SelectMapBezierline != null)
                {
                    BezierLineName = mapPanelDocker.SelectMapBezierline.LineName;
                }
                AGV_Block[] allBlocks = ReadXmlFile.ReadAllBlock(GlobalSystemConfig.Instance.AgvConfigPath);
                for (int i = 0; i < allBlocks.Length; i++)
                {
                    if (allBlocks[i].BlockName == strBlockName)
                    {
                        if (lineName != "")
                        {
                            if (!allBlocks[i].menbers.Contains(lineName))
                            {
                                if (allBlocks[i].menbers == "")
                                {
                                    allBlocks[i].menbers = lineName;
                                }
                                else
                                {
                                    allBlocks[i].menbers = allBlocks[i].menbers + "," + lineName;
                                }
                            }
                        }
                        if (BezierLineName != "")
                        {
                            if (!allBlocks[i].menbers.Contains(BezierLineName))
                            {
                                if (allBlocks[i].menbers == "")
                                {
                                    allBlocks[i].menbers = BezierLineName;
                                }
                                else
                                {
                                    allBlocks[i].menbers = allBlocks[i].menbers + "," + BezierLineName;
                                }
                            }
                        }
                        XmlHelper.WriteXmlFile.WriteOrCreateBlockValue(allBlocks[i], GlobalSystemConfig.Instance.AgvConfigPath);
                        InitialTreeViewLayout();
                    }
                }
            }
        }
        #endregion
        #region 移除
        private void deleteSelectPathToBlocksToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mapPanelDocker.SelectMapline != null || mapPanelDocker.SelectMapBezierline != null)
            {
                string strBlockName = this.treeviewLayout.SelectedNode.Text.Replace(" ", "").Replace("BlockBlock", "Block");
                string lineName = "";
                string BezierLineName = "";
                if (mapPanelDocker.SelectMapline != null)
                {
                    lineName = mapPanelDocker.SelectMapline.LineName;
                }
                if (mapPanelDocker.SelectMapBezierline != null)
                {
                    BezierLineName = mapPanelDocker.SelectMapBezierline.LineName;
                }
                AGV_Block[] allBlocks = ReadXmlFile.ReadAllBlock(GlobalSystemConfig.Instance.AgvConfigPath);
                for (int i = 0; i < allBlocks.Length; i++)
                {
                    if (allBlocks[i].BlockName == strBlockName)
                    {
                        if (lineName != "")
                        {
                            if (allBlocks[i].menbers.Contains(lineName))
                            {
                                if (allBlocks[i].menbers == lineName)
                                {
                                    allBlocks[i].menbers = "";
                                }
                                else if (allBlocks[i].menbers.Contains(lineName + ","))
                                {
                                    allBlocks[i].menbers = allBlocks[i].menbers.Replace(lineName + ",", "");
                                }
                                else
                                {
                                    allBlocks[i].menbers = allBlocks[i].menbers.Replace(lineName, "");
                                }
                            }
                        }
                        if (BezierLineName != "")
                        {
                            if (allBlocks[i].menbers.Contains(BezierLineName))
                            {
                                if (allBlocks[i].menbers == BezierLineName)
                                {
                                    allBlocks[i].menbers = "";
                                }
                                else if (allBlocks[i].menbers.Contains(BezierLineName + ","))
                                {
                                    allBlocks[i].menbers = allBlocks[i].menbers.Replace(BezierLineName + ",", "");
                                }
                                else
                                {
                                    allBlocks[i].menbers = allBlocks[i].menbers.Replace(BezierLineName, "");
                                }
                            }
                        }
                        XmlHelper.WriteXmlFile.WriteOrCreateBlockValue(allBlocks[i], GlobalSystemConfig.Instance.AgvConfigPath);
                        InitialTreeViewLayout();
                    }
                }
            }
        }
        #endregion
        #region 删除整个块
        private void deleteEntileBlocksToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string strBlockName = this.treeviewLayout.SelectedNode.Text.Replace(" ", "").Replace("BlockBlock", "Block");
            if (strBlockName.StartsWith("Block"))
            {
                if (mapPanelDocker.ListMapBlock != null && mapPanelDocker.ListMapBlock.Count > 0)
                {
                    for (int i = 0; i < mapPanelDocker.ListMapBlock.Count; i++)
                    {
                        if (mapPanelDocker.ListMapBlock[i].BlockName == strBlockName)
                        {
                            mapPanelDocker.ListMapBlock.Remove(mapPanelDocker.ListMapBlock[i]);
                            mapPanelDocker.SaveMap(GlobalSystemConfig.Instance.AgvConfigPath);
                            InitialTreeViewLayout();
                        }
                    }
                }
            }
        }
        #endregion
        #endregion
        #region 右键菜单打开时
        private void menuBlock_Opening(object sender, CancelEventArgs e)
        {

        }
        #endregion
        #region 点击进行选中当前节点
        private void treeviewLayout_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
            {
                this.treeviewLayout.SelectedNode = e.Node;
            }
        }
        #endregion
        #region 块点击事件
        private void btn_块_Click(object sender, EventArgs e)
        {
            if (newType == NodeType.Block)
            {
                MapBlock block = new MapBlock();
                block.OnColorChange += mapPanelDocker.block_OnColorChange;
                block.BlockName = "Block-" + GetMaxBlockName();
                block.BlockColor = Color.Red;
                block.menberLines = new List<MapLine>();
                block.menberBezierLines = new List<MapBezierLine>();
                block.isSlected = true;
                mapPanelDocker.ListMapBlock.Add(block);
                mapPanelDocker.SaveMap(GlobalSystemConfig.Instance.AgvConfigPath);
            }
            InitialTreeViewLayout();
        }
        #endregion
        #region 双击查找路径或者站点
        private void treeviewLayout_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            string whichText = e.Node.Text.Replace(" ", "");
            if (whichText.StartsWith("PointPoint") || whichText.StartsWith("PathPoint"))
            {
                AGV_Line[] allLines = XmlHelper.ReadXmlFile.ReadAllLine(GlobalSystemConfig.Instance.AgvConfigPath);
                if (whichText.StartsWith("PointPoint"))
                {
                    whichText = whichText.Replace("PointPoint", "Point").Replace("PathPoint", "Point");//点
                    foreach (Control item in mapPanelDocker.Controls)
                    {
                        if(item.GetType()==typeof(MapNode))
                        {
                            MapNode node = (MapNode)item;
                            if(node.Name==whichText)
                            {
                                Graphics g = mapPanelDocker.CreateGraphics();
                                g.SmoothingMode = SmoothingMode.HighQuality;
                                Pen p = new Pen(Color.Lime, 2);
                                Point pointTemp = new Point(node.Location.X - 25, node.Location.Y - 25);
                                Size sizeTemp = new Size(70, 70);
                                g.DrawEllipse(p, pointTemp.X, pointTemp.Y, sizeTemp.Width, sizeTemp.Height);
                            }
                        }
                    }
                }
                else
                {
                    whichText = whichText.Replace("PointPoint", "Point").Replace("PathPoint", "Point");//路径
                    if (allLines != null && allLines.Length > 0)
                    {
                        for (int i = 0; i < allLines.Length; i++)
                        {
                            if (allLines[i].LineName == whichText)
                            {
                                AGV_Line agvLine = allLines[i];
                                Pen p = new Pen(Color.Red, 2);
                                Graphics g = mapPanelDocker.CreateGraphics();
                                g.SmoothingMode = SmoothingMode.HighQuality;
                                if (agvLine.controlPoint1.X != 0)
                                {
                                    Point pointTemp = new Point(((agvLine.controlPoint1.X + agvLine.controlPoint2.X) / 2) - 20, ((agvLine.controlPoint1.Y + agvLine.controlPoint2.Y) / 2) - 20);
                                    Size sizeTemp = new Size(60, 60);
                                    g.DrawEllipse(p, pointTemp.X, pointTemp.Y, sizeTemp.Width, sizeTemp.Height);
                                }
                                else
                                {
                                    Point pointTemp1 = new Point(0,0);
                                    Point pointTemp2 = new Point(0, 0);
                                    foreach (Control item in mapPanelDocker.Controls)
                                    {
                                        if (item.GetType() == typeof(MapNode))
                                        {
                                            MapNode node = (MapNode)item;
                                            if (node.Name == agvLine.StartControl)
                                            {
                                                pointTemp1 = node.Location;
                                            }
                                            if (node.Name == agvLine.EndControl)
                                            {
                                                pointTemp2 = node.Location;
                                            }
                                        }
                                    }
                                    if (pointTemp1.X != 0 && pointTemp2.X != 0)
                                    {
                                        Point pointTemp = new Point(((pointTemp1.X + pointTemp2.X) / 2) - 20, ((pointTemp1.Y + pointTemp2.Y) / 2) - 20);
                                        Size sizeTemp = new Size(60, 60);
                                        g.DrawEllipse(p, pointTemp.X, pointTemp.Y, sizeTemp.Width, sizeTemp.Height);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        #endregion
        #region 新建一个地图文件
        private void btn_New_Click(object sender, EventArgs e)
        {
            mapPanelDocker.OpenMap("");
            GlobalSystemConfig.Instance.AgvConfigPath = "";
            InitialTreeViewLayout();
            floydCurrent = new FloydHelper();
        }
        #endregion

        #region 车点击事件
        private void btn_车_Click(object sender, EventArgs e)
        {
            if (newType == NodeType.Vehicle)
            {
                MapBlock block = new MapBlock();
                block.OnColorChange += mapPanelDocker.block_OnColorChange;
                block.BlockName = "Vehicle-" + GetMaxBlockName();
                block.BlockColor = Color.Red;
                block.menberLines = new List<MapLine>();
                block.menberBezierLines = new List<MapBezierLine>();
                block.isSlected = true;
                mapPanelDocker.ListMapBlock.Add(block);
                mapPanelDocker.SaveMap(GlobalSystemConfig.Instance.AgvConfigPath);
            }
            InitialTreeViewLayout();
        }
        #endregion
        #region 双击时
        private void treeViewVehicle_AfterSelect(object sender, TreeViewEventArgs e)
        {

        }
        #endregion
        #region 双击时将当前小车进行标定
        private void treeViewVehicle_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {

        }
        #endregion
        #region 鼠标左键或者有键将当前节点选中
        private void treeViewVehicle_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
            {
                this.treeViewVehicle.SelectedNode = e.Node;
            }
        }
        #endregion
        #region 是否显示站点的label
        bool showLabelFlag = true;
        private void button2_Click(object sender, EventArgs e)
        {
            if (showLabelFlag)
            {
                this.btn_ShowLabel.BackColor = Color.Transparent;
                showLabelFlag = false;
                foreach (Control item in this.mapPanelDocker.Controls)
                {
                    if (item.GetType() == typeof(Label))
                    {
                        item.Text = "";
                    }
                }
            }
            else
            {
                this.btn_ShowLabel.BackColor = Color.Wheat;
                showLabelFlag = true;
                foreach (Control item in this.mapPanelDocker.Controls)
                {
                    if (item.GetType() == typeof(Label))
                    {
                        item.Text = item.Name;
                    }
                }
            }
            this.mapPanelDocker.Invalidate();
        }
        #endregion
        #region 是否显示块的背景颜色
        bool showBlockLine = true;
        private void button1_Click(object sender, EventArgs e)
        {
            if (showBlockLine)
            {
                this.btn_ShowBlock.BackColor = Color.Wheat;
                showBlockLine = false;
                foreach (MapBlock item in this.mapPanelDocker.ListMapBlock)
                {
                    item.ShowBlockLineColor = false;
                }
            }
            else
            {
                this.btn_ShowBlock.BackColor = Color.Transparent;
                showBlockLine = true;
                foreach (MapBlock item in this.mapPanelDocker.ListMapBlock)
                {
                    item.ShowBlockLineColor = true;
                }
            }
            this.mapPanelDocker.Invalidate();
        }
        #endregion

        private void btn_查找小车_Click(object sender, EventArgs e)
        {

        }

        #region 显示当前地图的版本信息
        private void showToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string filePath = GlobalSystemConfig.Instance.AgvConfigPath;
            string StationNum, ParkingNum, DirectNum,
                   BezierNum, FileName, BlockNum,
                   VehicleNum, ModifyDate;
            ReadXmlFile.GetMapNodeNum(out StationNum, out ParkingNum, out DirectNum,
                                         out BezierNum, out FileName, out BlockNum,
                                         out VehicleNum, out ModifyDate, filePath);
            NumberModel model = new NumberModel()
            {
                StationNum = StationNum,
                ParkingStationnum = ParkingNum,
                DirectLineNum = DirectNum,
                BezierLineNum = BezierNum,
                FileName = FileName,
                BlockNum = BlockNum,
                VehicleNum = VehicleNum,
                ModifiedDate = ModifyDate
            };
            frm_Property = new frm_ModelProperty(model);
            frm_Property.ShowDialog();
        }
        #endregion

到了这里,关于C#开发AGV地图编辑软件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中规模软件开发实训——简单的文本编辑器(代码注释详解)

    ✨ 博主: 命运之光 🌸 专栏: Python星辰秘典 🐳 专栏: web开发(html css js) ❤️ 专栏: Java经典程序设计 ☀️ 博主的其他文章: 点击进入博主的主页 前言: 在现代社会中,计算器是我们生活中不可或缺的工具之一。它们可以轻松地进行各种数值计算,从简单的加减乘除

    2024年02月13日
    浏览(41)
  • 手敲Cocos简易地图编辑器:人生地图是一本不断修改的书,每一次编辑都是为了克服新的阻挡

    本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。 在上一篇文章,笔者给大家讲解了在Cocos独立游戏开发框架中,如何自定义实现Tile地图管理器,成功地在游戏中优化加载一张特大的地图。接下来笔者为大家讲解一下游戏中地图编辑器的思

    2024年02月09日
    浏览(47)
  • 瓦片地图编辑器——实现卡马克卷轴的编辑,键盘控制游戏移动和鼠标点击游戏编辑通过同一个视口实现。

      左边是游戏地图编辑区,右边是地图缓冲区,解决了地图缓冲区拖动bug,成功使得缓冲区可以更新。 AWSD进行移动 鼠标左右键分别是绘制/拖动 按F1健导出为mapv3.txt F2清空数组 打印的是游戏数组 easyx开发devcpp 5.11 easyx20220922版本

    2024年01月25日
    浏览(75)
  • 【Linux系列P4】Linux需要什么?编辑器?软件包?一文帮你了解掌握 [yum]&[vim]———基础开发工具篇

    前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向未接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门!  订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux系列-P1】 Linux环境的搭建 【Linux系列-P2】Linux的基本

    2024年02月06日
    浏览(58)
  • 如何将c#在线编辑器嵌入自己项目

    首先我们需要介绍一下这个在线编辑器,当前的在线编辑器支持c#的代码编译运行,并且无需后台服务,基于 WebAssembly 实现的在浏览器端去执行我们的 c# 代码,基于 Roslyn 提供的 Api 封装一套简单的编译,并且封装了 js 的支持,让嵌入的方式更简单。 最简单的嵌入方式是使用

    2024年02月03日
    浏览(44)
  • 【Linux】软件包管理器/编辑器/yum是应用商店?/vim编辑器什么?

    本文思维导图: 1.源代码安装 2. rpm安装 3.yum安装 其中前面两种安装方式不推荐,推荐第三种yum安装,本文也着重讲解yum安装问题。 关于Linux的软件生态问题,先知道几个点: 在我们的手机中,我们一般下载软件是去应用商店下载的。 而应用商店本身也是一个app,应用商店里

    2024年02月06日
    浏览(41)
  • 电脑视频编辑软件前十名 电脑视频编辑器怎么剪辑视频

    对于大多数创作者而言,视频后期工作基本都是在剪辑软件上进行的。一款适合自己的视频剪辑软件,能够节省出大量的时间和金钱成本,让剪辑师省钱又省心。那么有关电脑视频编辑软件前十名,电脑视频编辑器怎么剪辑视频的相关问题,本文将进行详细介绍。 接下来,作

    2024年02月11日
    浏览(59)
  • 天龙八部场景编辑器(源码+软件+教程)

    天龙八部场景编辑器,里面包括《源码》,《软件》,《教程》,喜欢研究天龙八部的可以下载看看。 天龙八部场景编辑器(源码+软件+教程) 下载地址: 链接:https://pan.baidu.com/s/1GWXErav06VnsM7LLhua0ig?pwd=ahe3 提取码:ahe3 --来自百度网盘超级会员V3的分享

    2024年01月24日
    浏览(36)
  • 【无标题】PDF编辑软件哪个好用?4款PDF编辑器分享!

    PDF编辑软件哪个好用?在我们的日常办公中,编辑PDF文件是非常方便的一项功能。通过编辑PDF,我们可以对文档进行修改和调整,添加或删除内容,以及进行格式和布局的更改。这样,我们可以更好地符合我们的需求和要求。此外,还可以帮助我们改善文档的可读性和专业性

    2024年02月02日
    浏览(79)
  • Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具

    目录 Ⅰ.  Linux 软件包管理器 yum 一、yum 背景知识 二、yum 的基本使用 1、查看软件包 2、软件包名称构成 3、安装软件 4、卸载软件 Ⅱ.vim编辑器  一、认识vim 1、vim概念  2、模式及其切换  二、vim使用 1、vim的指令(重要)  命令模式 插入模式 底行模式 2、vim配置 Ⅲ.gcc/g++编

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包