You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
16 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using ACadSharp.Tables;
using Arction.Wpf.ChartingMVVM;
using Arction.Wpf.ChartingMVVM.Series3D;
using Arction.Wpf.ChartingMVVM.Views.View3D;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using Txgy.EWS.Client.Common;
using WW.Cad.IO;
using WW.Cad.Model;
using Colors = System.Windows.Media.Colors;
using Color = System.Windows.Media.Color;
using WW.Cad.Model.Objects;
using WW.Cad.Model.Entities;
namespace Txgy.EWS.Client.PageModule.Models
{
public class LCPlanModel : BindableBase
{
public string CadFilePath { get; set; }
public LCPlanModel()
{
//CadFilePath = AppDomain.CurrentDomain.BaseDirectory + "\\resources\\" + GlobalConfig.ProjectConfig.CadFileName;
CadFilePath = GlobalConfig.ProjectConfig.CadFileName;
}
public List<PointLineSeries3D> CreateBackgroudByDwg()
{
List<PointLineSeries3D> dwgSeries = new List<PointLineSeries3D>();
DxfModel model = DwgReader.Read(CadFilePath);
try
{
Color color = Colors.Black;
double lineWidth = 0.05;
int lineStyle = 0;
bool closeLine = true;
foreach (var item in model.Layers)
{
switch (item.Name)
{
case "N1100台站位置实际位置":
break;
case "等高线-20":
color = Color.FromRgb(192, 192, 192);
lineWidth = 0.1;
lineStyle = 1;
closeLine = false;
break;
case "边界线":
color = Color.FromRgb(255, 0, 255);
lineWidth = 0.1;
lineStyle = 1;
closeLine = true;
break;
case "工作面标记":
color = Colors.LightGray;
lineWidth = 0.1;
lineStyle = 1;
closeLine = true;
break;
case "断层":
color = Colors.Red;
lineWidth = 0.03;
lineStyle = 1;
closeLine = true;
break;
}
if (item.Enabled)
{
//Console.WriteLine($"名称:{item.Name}\t开关{item.Enabled.ToString()}\t线宽:{item.LineWeight}\t线型{item.LineType.Name}");
var entitys = model.Entities.Where(et => et.Layer.Name == item.Name);
if (entitys != null)
{
foreach (var entity in entitys)
{
if (entity.EntityType== "LWPOLYLINE")
{
//Console.WriteLine($"线宽:{item.LineWeight}\t颜色{entity.Color.ToString()}");
List<SeriesPoint3D> points = new List<SeriesPoint3D>();
foreach (var point in ((DxfLwPolyline)entity).Vertices)
{
double x = (point.X - GlobalConfig.BaseX) / 1000f;
double y = (point.Y - GlobalConfig.BaseY) / 1000f;
points.Add(new SeriesPoint3D(x, 50, y, color));
}
dwgSeries.Add(CreateDxfLwPolyline(item.Name, entity.ToString(), false, lineStyle, lineWidth, points.ToArray(), closeLine));
}
if (entity.EntityType=="TEXT")
{
Console.WriteLine(1);
}
}
//Console.WriteLine(entitys.Count());
}
//Console.WriteLine(item.Model.Entities.Count);
}
}
//foreach (var item in model.Entities)
//{
// if (item.Layer.Enabled)
// {
// Console.WriteLine(item.EntityType);
// switch (item.EntityType)
// {
// case "LWPOLYLINE":
// switch (item.Layer.Name)
// {
// case "N1100台站位置实际位置":
// break;
// case "等高线-20":
// color = Color.FromRgb(192, 192, 192);
// lineWidth = 0.1;
// lineStyle = 1;
// closeLine = false;
// break;
// case "边界线":
// color = Color.FromRgb(255, 0, 255);
// lineWidth = 0.1;
// lineStyle = 1;
// closeLine = true;
// break;
// case "工作面标记":
// color = Colors.LightGray;
// lineWidth = 0.1;
// lineStyle = 1;
// closeLine = true;
// break;
// case "断层":
// color = Colors.Red;
// lineWidth = 0.03;
// lineStyle = 1;
// closeLine = true;
// break;
// }
// break;
// }
// List<SeriesPoint3D> points = new List<SeriesPoint3D>();
// foreach (var point in ((DxfLwPolyline)item).Vertices)
// {
// double x = (point.X - GlobalConfig.BaseX) / 100f;
// double y = (point.Y - GlobalConfig.BaseY) / 100f;
// points.Add(new SeriesPoint3D(x, 50, y, color));
// }
// dwgSeries.Add(CreateDxfLwPolyline(item.Layer.Name, item.ToString(), false, lineStyle, lineWidth, points.ToArray(), closeLine));
// }
// //if (item.EntityType == "LWPOLYLINE" &&
// // (item.Layer.Name == "巷道集合"
// // || item.Layer.Name == "工作面标记"
// // || item.Layer.Name == "断层"
// // || item.Layer.Name == "边界线"
// // || item.Layer.Name == "等高线-20"
// // || item.Layer.Name == "N1100台站位置实际位置"))
// //{
// // if (item.Layer.Name == "N1100台站位置实际位置")
// // {
// // //color = Color.FromRgb(192, 192, 192);
// // //lineWidth = 0.1;
// // //lineStyle = 1;
// // //closeLine = false;
// // Console.WriteLine(item.EntityType.ToString());
// // }
// // if (item.Layer.Name == "等高线-20")
// // {
// // color = Color.FromRgb(192, 192, 192);
// // lineWidth = 0.1;
// // lineStyle = 1;
// // closeLine = false;
// // }
// // if (item.Layer.Name=="边界线")
// // {
// // color = Color.FromRgb(255,0,255);
// // lineWidth = 0.1;
// // lineStyle = 1;
// // }
// // if (item.Layer.Name == "工作面标记")
// // {
// // color = Colors.LightGray;
// // lineWidth = 0.1;
// // lineStyle = 1;
// // }
// // else if (item.Layer.Name == "断层")
// // {
// // color = Colors.Red;
// // lineWidth = 0.03;
// // lineStyle = 1;
// // }
// // //Console.WriteLine(entcnt++);
// // //int cnt = ((DxfLwPolyline)item).Vertices.Count;
// // //int num = 0;
// // //SeriesPoint3D[] points3 = new SeriesPoint3D[cnt];
// // //foreach (var item2 in ((DxfLwPolyline)item).Vertices)
// // //{
// // // double x = (item2.X - GlobalConfig.BaseX) / 100f;
// // // double y = (item2.Y - GlobalConfig.BaseY) / 100f;
// // // points3[num] = new SeriesPoint3D(x, 50, y, color);
// // // //Console.WriteLine($"ID:{item2.Id}\tX:{x}\tY:{y}");
// // // num++;
// // // //Console.WriteLine($"ID:{item2.Id}\tPosition:{item2.Position}\tX:{item2.X}\tY:{item2.Y}\tBulge{item2.Bulge}");
// // //}
// // //PointLineSeries3D seriesMultiColorLine = new PointLineSeries3D();
// // //seriesMultiColorLine.Title.Text = "Multi-color line";
// // //seriesMultiColorLine.MultiColorLine = true;
// // //seriesMultiColorLine.AllowUserInteraction = true;
// // //seriesMultiColorLine.PointsVisible = false;
// // //seriesMultiColorLine.LineStyle.LineOptimization = (LineOptimization)lineStyle;
// // //seriesMultiColorLine.LineStyle.Width = lineWidth;
// // //seriesMultiColorLine.Points = points3;
// // //seriesMultiColorLine.ClosedLine= closeLine;
// //}
//}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return dwgSeries;
}
public List<PointLineSeries3D> CreateCadImage3DList()
{
List<PointLineSeries3D> pls3ds = new List<PointLineSeries3D>();
//for (int i = 0; i < 20; i++)
//{
pls3ds.Add(CreatePointLine3D("i", "cad",
new SeriesPoint3D[]
{
new SeriesPoint3D(10,10,10),
new SeriesPoint3D(100,20,20),
new SeriesPoint3D(120,30,30),
new SeriesPoint3D(40,40,1),
new SeriesPoint3D(50,50,4),
new SeriesPoint3D(60,60,8),
}, 1, 1));
//}
return pls3ds;
}
/// <summary>
/// Create collection of polygons
/// </summary>
/// <returns></returns>
internal Polygon3DCollection CreatePolygons()
{
List<Polygon3D> polygons = new List<Polygon3D>(5);
Polygon3DCollection polygon3Ds = new Polygon3DCollection();
polygons.Add(
CreatePolygon("Polygon A", Colors.Magenta,
new Polygon3DPoint[]
{
new Polygon3DPoint(0,0),
new Polygon3DPoint(0,10),
new Polygon3DPoint(8,10),
new Polygon3DPoint(8,8),
new Polygon3DPoint(4,8),
new Polygon3DPoint(3,7),
new Polygon3DPoint(3,0),
}, 0, 20));
polygons.Add(CreatePolygon("Polygon B", Colors.Orange,
new Polygon3DPoint[]
{
new Polygon3DPoint(4,8),
new Polygon3DPoint(8,8),
new Polygon3DPoint(8,6),
new Polygon3DPoint(3,6),
new Polygon3DPoint(3,7),
}, 0, 30));
polygons.Add(CreatePolygon("Polygon C", Colors.MistyRose,
new Polygon3DPoint[]
{
new Polygon3DPoint(3,6),
new Polygon3DPoint(8,6),
new Polygon3DPoint(8,2),
new Polygon3DPoint(5,2),
new Polygon3DPoint(6,4),
new Polygon3DPoint(3,4),
}, 0, 15));
polygons.Add(CreatePolygon("Polygon D", Colors.CornflowerBlue,
new Polygon3DPoint[]
{
new Polygon3DPoint(3,4),
new Polygon3DPoint(6,4),
new Polygon3DPoint(5,2),
new Polygon3DPoint(8,2),
new Polygon3DPoint(8,0),
new Polygon3DPoint(3,0),
}, 0, 25));
Color color = Colors.Aquamarine;
polygons.Add(CreatePolygon("Polygon E", Color.FromArgb(100, color.R, color.G, color.B),
new Polygon3DPoint[]
{
new Polygon3DPoint(8, 10),
new Polygon3DPoint(6, 7.5),
new Polygon3DPoint(7.5, 3),
new Polygon3DPoint(10, 4),
new Polygon3DPoint(9, 9),
}, 10, 40));
polygon3Ds.AddRange(polygons);
return polygon3Ds;
}
/// <summary>
/// Create polygons
/// </summary>
/// <param name="title"></param>
/// <param name="color"></param>
/// <param name="edgePoints"></param>
/// <param name="minY"></param>
/// <param name="maxY"></param>
/// <returns></returns>
private static Polygon3D CreatePolygon(string title, Color color, Polygon3DPoint[] edgePoints, double minY, double maxY)
{
Polygon3D polygon = new Polygon3D();
polygon.Material.DiffuseColor = color;
polygon.Material.DiffuseColor = color;
polygon.Points = edgePoints;
polygon.YMin = minY;
polygon.YMax = maxY;
return polygon;
}
private static PointLineSeries3D CreatePointLine3D(string title, string tag, SeriesPoint3D[] seriesPoint3Ds, int lineStyle, double lineWidth)
{
PointLineSeries3D pls3d = new PointLineSeries3D
{
Tag = tag,
Points = seriesPoint3Ds,
PointsVisible = true,
MultiColorLine = true,
AllowUserInteraction = true
};
pls3d.LineStyle.LineOptimization = (LineOptimization)lineStyle;
pls3d.LineStyle.Width = lineWidth;
pls3d.Points = seriesPoint3Ds;
return pls3d;
}
public static PointLineSeries3D CreateDxfLwPolyline(string tag, string title, bool allowUser, int lineStyle, double lineWidth, SeriesPoint3D[] points, bool closeLine)
{
PointLineSeries3D pls3d = new PointLineSeries3D();
pls3d.Tag = tag;
pls3d.Title.Text = title;
pls3d.MultiColorLine = true;
pls3d.AllowUserInteraction = allowUser;
pls3d.PointsVisible = false;
pls3d.LineStyle.LineOptimization = (LineOptimization)lineStyle;
pls3d.LineStyle.Width = lineWidth;
pls3d.Points = points;
pls3d.ClosedLine = closeLine;
return pls3d;
}
}
}