c# 属性改变

2021-06-06 20:02

阅读:573

标签:sof   trace   sele   ret   sel   res   clear   for   auto   

技术图片技术图片
 1 using System.ComponentModel;
 2 using System.Windows.Forms;
 3 using app.Main.Graph;
 4 using app.KeyBoards.Events;
 5 
 6 namespace app.Measure.Actions
 7 {
 8     /// 
 9     /// 操作接口
10     /// 
11     public interface IToolAction : IActor, INotifyPropertyChanged
12     {
13         /// 
14         /// 鼠标事件处理
15         /// 
16         /// 
17         /// 鼠标事件参数
18         void MouseEventHandle(object sender, MouseEventArgs eventArgs);
19 
20         /// 
21         /// 功能键按键事件处理
22         /// 
23         /// 功能键事件参数
24         void KeyBoardEventHandle(KeyBoardEventArgs eventArgs);
25         ///// 
26         ///// 按键事件处理
27         ///// 
28         ///// 按键事件参数
29         //void KeyEventHandle(KeyEventArgs keyEventArgs);
30     }
31 }
View Code
技术图片技术图片
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using app.Configuration.Models;
using app.Configuration.Services;
using app.Lib;
using app.Lib.Graph;
using app.Measure.Events;
using app.Measure.Models;
using app.Measure.ViewModels;
using app.Measure.Actions;
using Bedrock.Events;
using Microsoft.Practices.Unity;
using app.Main;
using app.Main.Graph;
using app.KeyBoards.Events;

namespace app.Measure.Tools
{
    //椭圆测量工具
    public class _2DEllipse : PropertyChangedBase,IToolAction
    {
        private readonly IEventAggregator _eventAggregator;
        private readonly IConfigService _configService;
        private readonly MeasureData _measureData;  //存放绘图工具的ID

        private readonly List _points;  //绘制椭圆的坐标集
        private readonly Measurement _measurement;     //该测量环境的XML配置
        private readonly Brush _plotBrush;     //绘制圆点的对象
        private readonly Pen _linePen;         //绘制曲线的对象
        private readonly int _widthOfPlot;     //圆点半径
        private ICoordinate _coordinate; //坐标系对象
        private readonly List _resultItems; //存放测量值的列表
        private int _resultIndex;  //测量值索引
        private double _width;      //椭圆的长半轴长
        private double _height;     //椭圆的短半轴长
        private readonly CalculationFomula _calculationFomula; // 计算公式
        private readonly MeasureToolType _measuretooltype;

        //读取工具XML的配置,初始化绘图工具
        public _2DEllipse(IUnityContainer unityContainer, IEventAggregator eventAggregator)
        {
            Logger.Log("_2DEllipse Start Initial", Level.Info);
            MeasureTool tool;
            var unityContainer1 = unityContainer;
            _eventAggregator = eventAggregator;
            _configService = unityContainer1.Resolve();
            _measureData = unityContainer1.Resolve();

            _resultItems = new List
            {
                new MeasureResultItem("LAxis", "mm", 0),
                new MeasureResultItem("SAxis", "mm", 0),
                new MeasureResultItem("Cir", "mm", 0),
                new MeasureResultItem("Area", "mm2", 0)
            };
            _resultIndex = 0;

            _calculationFomula = new CalculationFomula();
            _points = new List();
            if (_measureData.IsGenericTool == false)
            {
                _measurement = _configService.GetMeasurementId(_measureData.MeasurementId);
                tool = _configService.GetMeasureToolId(_measureData.ToolId);
            }
            else
            {
                _measurement = _configService.GetMeasurementId(_measureData.GenericToolItem[_measureData.GenericToolIndex].MeasurementId);
                tool = _configService.GetMeasureToolId(_measureData.GenericToolItem[_measureData.GenericToolIndex].ToolId);
            }
            _plotBrush = new SolidBrush(Common.IntToColor(tool.ColorOfPlot));
            _widthOfPlot = tool.WidthOfPlot;
            _measuretooltype = tool.MeasureToolType;
            _linePen = new Pen(Common.IntToColor(tool.ColorOfLine), tool.WidthOfLine) {DashStyle = tool.Dashstype};
            _eventAggregator.GetEventstring>>().Subscribe(EventHandle, true);
            Logger.Log("_2DEllipse End Initial", Level.Info);
        }

        //绘图
        public void Draw(Graphics graphics, ICoordinate coordinate)
        {
            //ToolDraw.DrawFromToolData(graphics, coordinate, _MeasureData.GetToolPositionDataItem);

            if (coordinate != null)
            {
                _coordinate = coordinate;
                if (_isInViewRegion == false)
                {
                    return;
                }
            }

            if (_points.Count 3)
            {
                foreach (var p in _points)
                {
                    graphics.FillEllipse(_plotBrush, new Rectangle(p.X - _widthOfPlot, p.Y - _widthOfPlot, _widthOfPlot * 2, _widthOfPlot * 2));
                }
            }

            if (_points.Count != 3) return;
            _width = 0.5 * Math.Sqrt((_points[0].X - _points[2].X) * (_points[0].X - _points[2].X) + (_points[0].Y - _points[2].Y) * (_points[0].Y - _points[2].Y));
            var p1 = new PointD((_points[2].X + _points[0].X) / 2.0, y: (_points[2].Y + _points[0].Y) / 2.0);
            _height = Math.Sqrt((p1.X - _points[1].X) * (p1.X - _points[1].X) + (p1.Y - _points[1].Y) * (p1.Y - _points[1].Y));
            if (coordinate != null)
                graphics.DrawEllipse(_linePen, (int)coordinate.ViewRegionD.Min.X, (int)coordinate.ViewRegionD.Min.Y, (int)_height * 2, (int)_width * 2);
        }

        //计算结果
        private void CaculateResult()
        {
            if (_coordinate == null)
            {
                return;
            }
            var p = new PointD((_points[2].X + _points[0].X) / 2.0, (_points[2].Y + _points[0].Y) / 2.0);
            p = _coordinate.ViewToWorld(p);
            var p1 = _coordinate.ViewToWorld(_points[0]);
            var p2 = _coordinate.ViewToWorld(_points[1]);
            var p3 = _coordinate.ViewToWorld(_points[2]);
            _width = 0.5 * _calculationFomula.Distance(p1, p3);
            _height = _calculationFomula.Distance(p, p2);
            _resultItems[0].Result = _width > _height ? 2 * _width : 2 * _height;//椭圆长轴长
            _resultItems[1].Result = _width 2 * _width : 2 * _height; //椭圆短轴长

            //椭圆周长
            _resultItems[2].Result = _calculationFomula.EllipseCirculation(_resultItems[0].Result, _resultItems[1].Result);
            //椭圆面积
            _resultItems[3].Result = _calculationFomula.EllipseArea(_resultItems[0].Result, _resultItems[1].Result);
        }

        /// 
        /// 功能键、旋钮处理
        /// 
        /// 
        public void KeyBoardEventHandle(KeyBoardEventArgs eventArgs)
        {

        }

        private MousePointEvent _mousePointEvent;
        private bool _isInViewRegion;
        private double _distance;

        //获取鼠标坐标
        private Point _mousePoint;
        private PointD _mousePointInView;
        public void MouseEventHandle(object sender, MouseEventArgs eventArgs)
        {
            _mousePoint = eventArgs.Location;
            if (_coordinate != null)
            {
                _mousePointInView = _coordinate.DisplayToView(_mousePoint);
                _isInViewRegion = _coordinate.ViewRegionD.Contains(_mousePointInView);
                _distance = _calculationFomula.Distance(_coordinate.ViewToWorld(_mousePoint), 
                    _coordinate.ViewToWorld(_coordinate.CenterPointD));
            }
            _mousePointEvent = new MousePointEvent(_distance, _isInViewRegion);
            _eventAggregator.GetEvent>().Publish(_mousePointEvent);

            if (eventArgs.Button == MouseButtons.Left && eventArgs.Clicks == 1)
            {
                MouseClick();
            }
        }

        //响应按键,收集坐标,commit后结果值在结果窗口中显示出来
        public void MouseClick()
        {
            if (_points.Count == 3 && _measurement.AutoNext == false)
            {
                return;
            }
            if (_points.Count >= 3)
            {
                _points.Clear();
                _points.Add(_mousePoint);
            }
            else
            {
                _points.Add(_mousePoint);
            }
            if (_points.Count == 3)
            {
                //if (_measurement.AutoNext == false)
                //{
                //    return;
                //}
                CaculateResult();

                for (_resultIndex = _resultItems.Count - 1; _resultIndex >= 0; _resultIndex--)
                {
                    _eventAggregator.GetEvent()
                        .Publish(new MeasureEventArgs(MessureEventType.MessureToolCommit,
                            _resultItems[_resultIndex].Clone()));
                }
            }
            NotifyPropertyChanged(OperateState.MeasureRepaint);
        }

        bool _isCalc;
        private void EventHandle(string e) //重绘,显示结果等事件处理
        {
            switch (e)
            {
                case EventNames.MeasureToolpaint:
                    NotifyPropertyChanged(OperateState.MeasureRepaint);
                    break;
                case EventNames.MeasureToolRepaint:
                    _points.Clear();
                    NotifyPropertyChanged(OperateState.MeasureRepaint);
                    break;
                case EventNames.MeasureToolCalcResult:
                    MeasureToolType measuretooltype = _configService.GetMeasureToolId(_measureData.ToolId).MeasureToolType;
                    if (_measurement.AutoCaculate == false && _isCalc == false && _points.Count == 3 && measuretooltype == _measuretooltype)
                    {
                        _isCalc = true;
                        CaculateResult();
                        for (_resultIndex = _resultItems.Count - 1; _resultIndex >= 0; _resultIndex--)
                        {
                            _eventAggregator.GetEvent()
                                .Publish(new MeasureEventArgs(MessureEventType.MessureToolCommit, _resultItems[_resultIndex].Clone()));
                        }
                    }
                    break;
                case EventNames.MeasureToolNextPaint:
                    if (_measurement.AutoNext == false)
                    {
                        _points.Clear();
                        _isCalc = false;
                    }
                    NotifyPropertyChanged(OperateState.MeasureRepaint);
                    break;
            }
        }
    }
}
View Code
技术图片技术图片
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using app.Configuration.Models;
using app.Configuration.Services;
using app.Lib;
using app.Lib.Graph;
using app.Measure.Events;
using app.Measure.Models;
using app.Measure.ViewModels;
using app.Measure.Actions;
using Bedrock.Events;
using Microsoft.Practices.Unity;
using System.Drawing.Drawing2D;
using app.Main;
using app.Main.Graph;
using app.KeyBoards.Events;
using app.Main.ViewModels;

namespace app.Measure.Tools
{
    //轨迹/区域测量工具
    public class _2DTrace : PropertyChangedBase,IToolAction
    {
        private readonly IEventAggregator _eventAggregator;
        private readonly IConfigService _configService;
        private readonly MeasureData _measureData;  //存放绘图工具的ID

        private List _points;  //轨迹/区域的坐标集
        private List>  _tempPoints;
        private readonly MeasureTool _tool;    //绘图工具的配置信息
        private readonly Measurement _measurement;     //该测量环境的XML配置
        private readonly Font _textFont;       //文本格式对象
        private readonly Brush _textBrush;     //绘制文本的对象
        private ICoordinate _coordinate; //坐标系对象
        private readonly List _resultItems;  //存放测量值的列表
        private readonly CalculationFomula _calculationFomula; // 计算公式
        private readonly MeasureToolType _measuretooltype;

        private readonly SystemStateModel _systemStateModel;
        private readonly string[] _promptString = { "Place the first point of the closed trace", "Trace the area boundary" };

        //读取工具XML的配置,初始化绘图工具
        public _2DTrace(IUnityContainer unityContainer, IEventAggregator eventAggregator)
        {
            Logger.Log("_2DTrace Start Initial", Level.Info);
            var unityContainer1 = unityContainer;
            _eventAggregator = eventAggregator;
            _configService = unityContainer1.Resolve();
            _measureData = unityContainer1.Resolve();
            _systemStateModel = unityContainer1.Resolve();
            _coordinate = MeasureAction.GetCoordinate();

            _resultItems = new List
            {
                new MeasureResultItem("TCir", "mm", 0),
                new MeasureResultItem("TArea", "mm2", 0)
            };

            _calculationFomula = new CalculationFomula();
            _points = new List();
            _tempPoints = new List>();
            if (_measureData.IsGenericTool == false)
            {
                _measurement = _configService.GetMeasurementId(_measureData.MeasurementId);
                _tool = _configService.GetMeasureToolId(_measureData.ToolId);
            }
            else
            {
                _measurement = _configService.GetMeasurementId(_measureData.GenericToolItem[_measureData.GenericToolIndex].MeasurementId);
                _tool = _configService.GetMeasureToolId(_measureData.GenericToolItem[_measureData.GenericToolIndex].ToolId);
            }
            _measuretooltype = _tool.MeasureToolType;
            _textFont = new Font("Consolas", 10.5F, FontStyle.Bold, GraphicsUnit.Point, 0);
            _textBrush = new SolidBrush(Common.IntToColor(_tool.ColorOfLine));
            _eventAggregator.GetEventstring>>().Subscribe(EventHandle, true);

            if (_measureData.GetToolPositionDataItem == null)
            {
                var toolDataList = new List();
                _measureData.GetToolPositionDataItem = toolDataList;
            }
            if (_measureData.GetMeasureResultData == null)
            {
                var toolDataList = new List();
                _measureData.GetMeasureResultData = toolDataList;
            }

            _pen = new Pen(Color.Green, _tool.WidthOfLine) {DashStyle = DashStyle.Dash};
            Logger.Log("_2DTrace End Initial", Level.Info);
        }

        private ToolPositionDataItem _toolPositionDataItem;
        private List _fillEllipse;
        private List _drawCurve;

        private readonly Pen _pen;//旋钮旋转重绘的颜色
        private bool _isRotatebuttonRepaintFirstTime = true;//旋钮旋转重绘,该情况下是否第一次调用Draw函数

        //绘图
        public void Draw(Graphics graphics, ICoordinate coordinate)
        {
            if (coordinate != null)
            {
                _coordinate = coordinate;
            }
            else
            {
                return;
            }

            if (false == _measureData.IsRotatingButtonRePaint)
            {
                ToolDraw.DrawFromToolData(graphics, coordinate, _measureData.GetToolPositionDataItem, _currentsender);

                switch (_keynum%3)
                {
                    case 0:
                        if (_isInViewRegion)
                        {
                            MeasureAction.Cursortype = CursorType.CursorAreaPicture; 
                        }
                        break;
                    case 1:
                        if (_isInViewRegion == false)
                        {
                            UserControl temp = _measureData.MouseEventSender as UserControl;
                            if (null != temp)
                                Cursor.Clip = temp.RectangleToScreen(Rectangle.Round(_coordinate.DisplayRegion));
                        }
                        else
                        {
                            MeasureAction.Cursortype = CursorType.CursorPicture;
                        }
                        break;
                    default:
                        MeasureAction.Cursortype = MeasureAction.AutoNextMeasure == false ? CursorType.CursorEmptyPicture : CursorType.CursorAreaPicture;
                        break;
                }
            }
            else
            {
                if (_isInViewRegion == false)
                {
                    UserControl temp = _measureData.MouseEventSender as UserControl;
                    if (null != temp)
                        Cursor.Clip = temp.RectangleToScreen(Rectangle.Round(_coordinate.DisplayRegion));
                }
                MeasureAction.Cursortype = CursorType.CursorPicture;

                _isRotatebuttonRepaintFirstTime = _measureData.IsFirsttimeRotatePaint;

                _tempPoints.Clear();
                ToolDraw.RotateRepaintFromToolData(graphics, coordinate, _measureData.GetToolPositionDataItem,
                    _measureData.RotatingButtonSelectedPointNum, _measureData.RotatingButtonSelectedIndex, ref _tempPoints,
                    _mousePoint, _pen, _isRotatebuttonRepaintFirstTime, _isInViewRegion, _measureData.MouseEventSender);
                _measureData.IsFirsttimeRotatePaint = false;
                _points = _tempPoints[0];
            }
        }

        //计算结果
        private void CaculateResult()
        {
            if (_coordinate == null)
            {
                return;
            }
            var pointds = new List();
            pointds.Clear();
            for (var i = 0; i 1; i++)
            {
                var p1 = _coordinate.ViewToWorld(_points[i]);
                pointds.Add(p1);
            }
            //trace的周长计算
            _resultItems[0].Result = _calculationFomula.TraceCirculation(pointds);
            //trace的面积
            _resultItems[1].Result = _calculationFomula.TraceArea(pointds);
        }

        /// 
        /// 功能键、旋钮处理
        /// 
        /// 
        public void KeyBoardEventHandle(KeyBoardEventArgs eventArgs)
        {

        }

        private MousePointEvent _mousePointEvent;
        private bool _isInViewRegion;
        private double _distance;
        private object _currentsender;

        //获取鼠标坐标
        private Point _mousePoint;
        private PointD _mousePointInView;
        public void MouseEventHandle(object sender, MouseEventArgs eventArgs)
        {
            _currentsender = sender;
            _measureData.MouseEventSender = sender;
            _mousePoint = eventArgs.Location;
            if (_coordinate != null)
            {
                _mousePointInView = _coordinate.DisplayToView(_mousePoint);
                _isInViewRegion = _coordinate.ViewRegionD.Contains(_mousePointInView);
                _distance = _calculationFomula.Distance(_coordinate.ViewToWorld(_mousePoint),
                    _coordinate.ViewToWorld(_coordinate.CenterPointD));
            }

            if (_keynum % 3 == 1)
            {
                if (_isInViewRegion)
                {
                    if (_points.Count > 3)
                    {
                        double angle = _calculationFomula.AngleOfPoint(_mousePoint, _points[_points.Count - 2],
                            _points[_points.Count - 1]);
                        double distance = _calculationFomula.Distance(_mousePoint, _points[_points.Count - 1]);
                        if (distance > 1 && angle >= 120)
                        {
                            _points.Add(_mousePoint);
                            //ToolDraw.SetCursorPositon(_mousePoint, sender);
                        }
                        else if (distance > 1 && angle 120)
                        {
                            _points.Remove(_points[_points.Count - 1]);
                            //ToolDraw.SetCursorPositon(_points[_points.Count - 1], sender);
                        }
                    }
                    else
                    {
                        _points.Add(_mousePoint);
                    }

                    if (false == _measureData.IsRotatingButtonRePaint)
                    {
                        AddDataItem(_points);
                    }
                }

                NotifyPropertyChanged(OperateState.MeasureRepaint);
            }

            if (_isInViewRegion)
            {
                switch (_keynum%3)
                {
                    case 0:
                        if (_systemStateModel.HintText != _promptString[0])
                            _systemStateModel.HintText = _promptString[0];
                        break;
                    case 1:
                        if (_systemStateModel.HintText != _promptString[1])
                            _systemStateModel.HintText = _promptString[1];
                        break;
                    default:
                        if (_systemStateModel.HintText != "")
                            _systemStateModel.HintText = "";
                        break;
                }
            }
            else
            {
                MeasureAction.Cursortype = CursorType.Max;
                if (_systemStateModel.HintText != "")
                    _systemStateModel.HintText = "";
            }

            _mousePointEvent = new MousePointEvent(_distance, _isInViewRegion) {MeasureResultItem = {Name = "Area"}};
            NotifyPropertyChanged(OperateState.MeasureRepaint);
            _eventAggregator.GetEvent>().Publish(_mousePointEvent);

            if (eventArgs.Button == MouseButtons.Left && eventArgs.Clicks == 1 && _isInViewRegion)
            {
                if (_measureData.IsRotatingButtonRePaint)
                {
                    Cursor.Clip = Rectangle.Empty;
                    CaculateResult();

                    var temp = new MeasureResultData {Name = _measuretooltype.ToString()};
                    foreach (var t in _resultItems)
                    {
                        temp.MeasureResultItem.Add(t.Clone() as MeasureResultItem);
                    }
                    _measureData.GetMeasureResultData.Add(temp);

                    _eventAggregator.GetEvent()
                        .Publish(new MeasureEventArgs(MessureEventType.MessureToolCommit, _resultItems[0].Clone()));
                }
                else
                {
                    MouseClick();
                }
                _measureData.IsRotatingButtonRePaint = false;
            }
        }

        private void AddDataItem(List points)
        {
            if (_fillEllipse.Count > 0)
            {
                _fillEllipse.Remove(_fillEllipse[0]);
            }
            _fillEllipse.Add(points[0]);

            DrawCurvePoint point1 = new DrawCurvePoint();
            foreach (Point point in points)
            {
                point1.CurvePoint.Add(point);
            }

            if (_drawCurve.Count > 0)
            {
                _drawCurve.Remove(_drawCurve[0]);
            }
            _drawCurve.Add(point1);

            if (_measureData.GetToolPositionDataItem.Count > _measureData.MaxMeasureTimes)
            {
                _measureData.GetToolPositionDataItem.Remove(_measureData.GetToolPositionDataItem[0]);
            }
        }

        //响应按键,收集坐标,commit后结果值在结果窗口中显示出来
        int _keynum; //记录按键次数
        public void MouseClick()
        {
            //if (keynum != 0 && keynum % 3 == 2 && _measurement.AutoNext == false)
            if (_keynum != 0 && _keynum % 3 == 2 && MeasureAction.AutoNextMeasure == false)
            {
                return;
            }
            _keynum++;
            switch (_keynum % 3)
            {
                case 1:
                    _points.Clear();
                    _fillEllipse = new List();
                    _drawCurve = new List();
                    _toolPositionDataItem = new ToolPositionDataItem(_drawCurve, _fillEllipse)
                    {
                        ColorOfLine = _tool.ColorOfLine,
                        ColorOfPlot = _tool.ColorOfPlot,
                        WidthOfLine = _tool.WidthOfLine,
                        WidthOfPlot = _tool.WidthOfPlot,
                        Dashstype = _tool.Dashstype,
                        TextBrush = _textBrush,
                        TextFont = _textFont,
                        MeasureToolType = _measuretooltype,
                        ModeType = _measureData.ModelType,
                        PointNum = 1,
                        ItemNum = _resultItems.Count,
                        ViewName = (_measureData.MouseEventSender as Control) == null ? "" : ((Control) _measureData.MouseEventSender).Name
                    };
                    _measureData.GetToolPositionDataItem.Add(_toolPositionDataItem);
                    if (_isInViewRegion)
                    {
                        _points.Add(_mousePoint);

                        if (false == _measureData.IsRotatingButtonRePaint)
                        {
                            AddDataItem(_points);
                        }
                    }
                    break;
                case 2:
                    if (_drawCurve.Count != 0)
                        _drawCurve[0].IsFinished = true;

                    if (_measurement.AutoCaculate == false)
                    {
                        return;
                    }
                    CaculateResult();

                    var temp = new MeasureResultData {Name = _measuretooltype.ToString()};
                    foreach (var t in _resultItems)
                    {
                        temp.MeasureResultItem.Add(t.Clone() as MeasureResultItem);
                    }
                    _measureData.GetMeasureResultData.Add(temp);

                    _eventAggregator.GetEvent()
                        .Publish(new MeasureEventArgs(MessureEventType.MessureToolCommit, _resultItems[0].Clone()));

                    _toolPositionDataItem.IsFinished = true;
                    break;
            }
            NotifyPropertyChanged(OperateState.MeasureRepaint);
        }

        bool _isCalc;
        private void EventHandle(string e) //重绘,显示结果等事件处理
        {
            switch (e)
            {
                case EventNames.MeasureToolpaint:
                    NotifyPropertyChanged(OperateState.MeasureRepaint);
                    break;
                case EventNames.MeasureToolRepaint:
                    _points.Clear();
                    _keynum = 0;
                    NotifyPropertyChanged(OperateState.MeasureRepaint);
                    break;
                case EventNames.MeasureToolCalcResult:
                    var measuretooltype = _configService.GetMeasureToolId(_measureData.ToolId).MeasureToolType;
                    if (_measurement.AutoCaculate == false && _isCalc == false && _keynum % 3 == 2 && measuretooltype == _measuretooltype)
                    {
                        _isCalc = true;
                        CaculateResult();
                        for (var i = _resultItems.Count - 1; i >= 0; i--)
                        {
                            _eventAggregator.GetEvent()
                                .Publish(new MeasureEventArgs(MessureEventType.MessureToolCommit, _resultItems[i].Clone()));
                        }
                    }
                    break;
                case EventNames.MeasureToolNextPaint:
                    if (_measurement.AutoNext == false)
                    {
                        _keynum = 0;
                        _isCalc = false;
                    }
                    NotifyPropertyChanged(OperateState.MeasureRepaint);
                    break;
            }
        }
    }
}
View Code

 

c# 属性改变

标签:sof   trace   sele   ret   sel   res   clear   for   auto   

原文地址:https://www.cnblogs.com/fengbaobao/p/10765037.html


评论


亲,登录后才可以留言!