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#

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;
}
}
}