井身结构示意图绘制(WPF)

、井深结构示意图绘制所有遵循的石油行业规定
  1. 钻头绘制:绘制一条具有波浪形状的线条
  2. 套管绘制:绘制一条实心线条,加上尾部一张旗帜
  3. 标注绘制:包括每一开次的钻头大小、长度和套管大小
、井身结构示意图绘制步骤
  1. 绘制中心虚线(井眼轨迹线)
  2. 遍历每一开次的信息 
    1. 绘制套管(套管用实心线表示,套管结尾用黑色小三角形符号表示)
    2. 绘制钻头(钻头用波浪线表示)
    3. 添加标注
三、井身结构示意图效果如下


四、井身结构示意图的具体绘制方法(WPF)
  • 本井身结构示意图的绘制均使用Polyline ,Polyline 的使用详见《深入浅出wpf》中的绘图部分
  • Polyline 的数据来源为PointCollection 
  • 本井身结构示意图的绘制的关键之处在于计算处于不同井深的点Point
       //通过点的坐标的集合来绘制直线
       public static Polyline GetPolylineByPoints(PointCollection points)
        {

            Polyline polyline = new Polyline();

            polyline.Points = points;  //设置直线的数据
            polyline.Stroke = Brushes.Black; //设置直线的颜色

            return polyline;
        }
      
  • 从上面的井深结构示意图可以看出,其绘制主要包括虚线的绘制、实线(曲线也是直线,只不过绘制时需要很多的点)的绘制、黑色小三角形的绘制,其绘制如下
         
1.虚线的绘制 
        public static Polyline GetDashPolylineByPoints(PointCollection points)
        {
            Polyline polyline = new Polyline();

            polyline.Points = points; //points为绘制直线所需的数据(点的集合)
            polyline.Stroke = Brushes.Red; //直线的颜色
            polyline.StrokeDashArray = new DoubleCollection(new List<double>() { 1, 1 });   //虚线和实线的比例

            return polyline;
        }

2.实线的绘制 
        public static Polyline GetPolylineByPoints(PointCollection points)
        {

            Polyline polyline = new Polyline();

            polyline.Points = points; //points为绘制直线所需的数据(点的集合)
            polyline.Stroke = Brushes.Black;  //直线的颜色

            return polyline;
        }

3.黑色三角形的绘制
        public static Polyline GetPolylineByPoints(PointCollection points)
        {

            Polyline polyline = new Polyline();

            polyline.Points = points; //points为绘制直线所需的数据( 3个点的集合
            polyline.Stroke = Brushes.Black;  //直线的颜色
            polyline.Fill = Brushes.Black;   //填充颜色

            return polyline;
        }
五、井身结构示意图的绘制  (WPF)
       无论是水平井,直井,还是定向井的绘制,其关键之处在于计算各个点的坐标,然后将其添加到一个点的集合中 points,然后再绘制直线、虚线、或三角形。
六、直井---井身结构示意图的绘制  (WPF)  
      直井的井身结构示意图绘制较为简单,此处只介绍示意图中曲线的绘制

      private PointCollection GetZigzagPointsByPosition(Point startPoint,Point endPoint)
      {
int timeTick = (int)(DateTime.Now.ToOADate() * 100000000);
Random random = new Random(timeTick);

PointCollection points =new PointCollection();
points.Add(startPoint);

PointcurrentPoint =startPoint;
while( currentPoint .Y<endPoint.Y)
{
    Point pt = new Point((random.NextDouble() - 0.5) * 3 + currentPoint .X, random.NextDouble() * 5 + currentPoint.Y);
    points.Add(pt);
     currentPoint = pt;
}

points.Add(endPoint);

returnpoints;
      }
      获取绘制曲线所需数据points之后,调用上面绘制实线的方法即可得到一条曲线
七、水平井---井身结构示意图的绘制  (WPF)  

八、定向井---井身结构示意图的绘制  (WPF)  

九、添加标记
        /// <summary>
        /// 添加标注
        /// </summary>
        /// <param name="lineStartPosition">被标注点的坐标</param>
        /// <param name="lineEndPosition">标注坐标</param>
        /// <param name="casingStr">套管信息</param>
        /// <param name="drillStr">标注信息</param>
        private void AddNotation(Point lineStartPosition, Point lineEndPosition, string casingStr, string drillStr, Canvas casingCanvas)
        {
            ///产生线条
            Line currentLine = new Line();  //标注和被标注点之间的连线
            currentLine.X1 = lineStartPosition.X;
            currentLine.Y1 = lineStartPosition.Y;
            currentLine.X2 = lineEndPosition.X;
            currentLine.Y2 = lineEndPosition.Y;
            currentLine.Stroke = Brushes.DarkBlue;
            currentLine.StrokeThickness = 0.5;
            casingCanvas.Children.Add(currentLine);


            Grid currentGrid = new Grid();  //标注
            currentGrid.RowDefinitions.Add(new RowDefinition());
            currentGrid.RowDefinitions.Add(new RowDefinition());
            currentGrid.Background = Brushes.White;


            Border border = new Border();
            border.BorderBrush = Brushes.DarkBlue;
            border.BorderThickness = new Thickness(0, 0, 0, 1);
            currentGrid.Children.Add(border);
            border.SetValue(Grid.RowProperty, 0);


            Label drillLabel = new Label(); //创建标签,显示标注
            drillLabel.Padding = new Thickness(0);
            drillLabel.Content = casingStr;
            drillLabel.Foreground = Brushes.DarkBlue;
            drillLabel.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left;
            border.Child = drillLabel; 

            Label casingLabel = new Label();
            casingLabel.Padding = new Thickness(0);
            casingLabel.Content = drillStr;
            casingLabel.Foreground = Brushes.DarkBlue;
            casingLabel.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left;
            currentGrid.Children.Add(casingLabel);
            casingLabel.SetValue(Grid.RowProperty, 1); 

            casingCanvas.Children.Add(currentGrid); 
            currentGrid.SetValue(Canvas.LeftProperty, lineEndPosition.X);
            currentGrid.SetValue(Canvas.TopProperty, lineEndPosition.Y - 16); 
  
        }
         
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值