// // Copyright (c) PlaceholderCompany. All rights reserved. // using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; using GeoSigma.SigmaDrawerStyle; using GeoSigmaDrawLib; using SigmaDrawerStyle; namespace SigmaDrawerElement { /// /// The drawer well group. /// [XmlRoot("WellGroup")] public class DrawerWellGroup : DrawerPoint, INotifyPropertyChanged { [XmlElement("HowToViewPoint")] [Category("井组"), DisplayName("井点样式"), Browsable(false)] public DrawerPointStyle WellPointStyle { get; set; } /// /// Gets or sets 井支. /// [Category("井组"), DisplayName("井支")] public List WellBranches { get; set; } = new List(); /// /// Gets or sets 参数. /// [Category("井组"), DisplayName("参数")] public WellGroupParameter Parameter { get; set; } = new WellGroupParameter(); /// /// Initializes a new instance of the class. /// public DrawerWellGroup() { ElementType = DrawElementType.ELEMENT_WELL_GROUP; } public bool CreateHorizionWells() { WellBranches.Clear(); string strWellName = this.Name; double dDistanceRight = Parameter.BranchDistanceRight; double dDistanceLeft = Parameter.BranchDistanceLeft; double dBranchAngle = Parameter.BranchAngle; double dBranchSpace = Parameter.BranchSpace; double dBranchLength = Parameter.BranchLength; int nBranchCount = Parameter.BranchCountRight; List lstBranchRigh = this.CreateBranchs(dDistanceRight, dBranchSpace, dBranchLength, nBranchCount, true); WellBranches.AddRange(lstBranchRigh); nBranchCount = Parameter.BranchCountLeft; if (Parameter.BranchCountLeft > 0) { List lstBranchLeft = this.CreateBranchs(dDistanceLeft, dBranchSpace, dBranchLength, nBranchCount, false); WellBranches.AddRange(lstBranchLeft); } if (this.Parameter.BranchAngle != 0) { double dAngle = this.Parameter.BranchAngle * Math.PI / 180.0; int nCount = WellBranches.Count; for (int i = 0; i < nCount; i++) { WellBranch branchOld = WellBranches[i]; DrawerPoint ptRotate = RotatePoint(branchOld.PointStart.X, branchOld.PointStart.Y , 0, 0, dAngle); branchOld.PointStart.X = ptRotate.X; branchOld.PointStart.Y = ptRotate.Y; ptRotate = RotatePoint(branchOld.PointEnd.X, branchOld.PointEnd.Y , 0, 0, dAngle); branchOld.PointEnd.X = ptRotate.X; branchOld.PointEnd.Y = ptRotate.Y; } } Offset(this.Parameter.WellPoint.X, this.Parameter.WellPoint.Y); //Z = this.Parameter.WellPoint.Z; //// 设置井点样式 //DrawerPointStyle ptstyleWell = new DrawerPointStyle(); //ptstyleWell.AlignHorizion = (int)TextStyleFlags.alignCenterH; //ptstyleWell.AlignVertical = (int)TextStyleFlags.alignTop; //ptstyleWell.Offset = new PropertyPoint(0, Parameter.SymbolSize * 0.5); //PropertySize txtSize = default(PropertySize); //txtSize.Width = Parameter.FontHeight * 0.4; //txtSize.Height = Parameter.FontHeight; //txtSize.FixScale = true; //SizeF sizeSymbol = new SizeF((float)Parameter.SymbolSize, (float)Parameter.SymbolSize); //ptstyleWell.TextSize = txtSize; //ptstyleWell.SymbolSize = sizeSymbol; //ptstyleWell.SymbolName = Parameter.SymbolWell.SymbolName; //WellPointStyle = ptstyleWell; //// 设置井支入靶点和出靶点样式 //int nBranchAllCount = wellGroup.WellBranches.Count; //for (int i = 0; i < nBranchAllCount; i++) //{ // WellBranch branch = wellGroup.WellBranches[i]; // branch.PointStyles = new List(); // DrawerPointStyle ptStart = ptstyleWell.Clone(); // ptStart.Name = "start"; // ptStart.SymbolName = Parameter.SymbolStart.SymbolName; // ptStart.SymbolSize = new SizeF((float)(sizeSymbol.Width * 0.5), (float)(sizeSymbol.Height * 0.5)); // //ptStart.TextSize = txtSize; // //ptStart.SymbolSize = sizeSymbol; // branch.PointStyles.Add(ptStart); // DrawerPointStyle ptEnd = ptstyleWell.Clone(); // ptEnd.Name = "end"; // ptEnd.SymbolName = Parameter.SymbolEnd.SymbolName; // ptEnd.SymbolSize = new SizeF((float)(sizeSymbol.Width * 0.5), (float)(sizeSymbol.Height * 0.5)); // // ptEnd.TextSize = txtSize; // // ptEnd.SymbolSize = sizeSymbol; // branch.PointStyles.Add(ptEnd); // branch.PointStart.Name = $"{strWellName}-{i + 1}A"; // branch.PointEnd.Name = $"{strWellName}-{i + 1}B"; // branch.LineStyles = new List(); // DrawerCurveStyle drawerCurveStyleOffset = new DrawerCurveStyle(); // drawerCurveStyleOffset.Name = "offset"; // CurveProperty curvePropertyOffset = new CurveProperty(); // curvePropertyOffset.Width = Parameter.OffsetLineWidth; // curvePropertyOffset.LineColor = Parameter.OffsetColor; // drawerCurveStyleOffset.Properties.Add(curvePropertyOffset); // branch.LineStyles.Add(drawerCurveStyleOffset); // DrawerCurveStyle drawerCurveStyleHori = new DrawerCurveStyle(); // drawerCurveStyleHori.Name = "horizon"; // CurveProperty curvePropertyHori = new CurveProperty(); // curvePropertyHori.Width = Parameter.HorizonLineWidth; // curvePropertyHori.LineColor = Parameter.HorizonColor; // drawerCurveStyleHori.Properties.Add(curvePropertyHori); // branch.LineStyles.Add(drawerCurveStyleHori); //} //DrawerElementProperty element = new DrawerElementProperty(); //element.Element = wellGroup; //element.ElementType = wellGroup.ElementType; //string strElementData = DrawerElementHelp.Serialize(element); //drawer.Geo.AddWellGroupSetData(strElementData); return true; } /// /// 获得井组的数据范围 /// /// 范围 public RectangleD CaculateDataRange() { double dXMin = this.X; double dYMin = this.Y; double dXMax = this.X; double dYMax = this.Y; foreach (var branch in WellBranches) { dXMin = Math.Min(dXMin, branch.PointEnd.X); dXMin = Math.Min(dXMin, branch.PointStart.X); dYMin = Math.Min(dYMin, branch.PointEnd.Y); dYMin = Math.Min(dYMin, branch.PointStart.Y); dXMax = Math.Max(dXMax, branch.PointEnd.X); dXMax = Math.Max(dXMax, branch.PointStart.X); dYMax = Math.Max(dYMax, branch.PointEnd.Y); dYMax = Math.Max(dYMax, branch.PointStart.Y); } return new RectangleD(dXMin, dYMin, dXMax - dXMin, dYMax - dYMin); } /// /// 计算旋转后的坐标 /// /// /// /// /// /// /// private DrawerPoint RotatePoint(double sourceX, double sourceY, double ox, double oy, double angle) { double rotatedX = ox + (sourceX - ox) * Math.Cos(angle) - (sourceY - oy) * Math.Sin(angle); double rotatedY = oy + (sourceX - ox) * Math.Sin(angle) + (sourceY - oy) * Math.Cos(angle); return new DrawerPoint(string.Empty, rotatedX, rotatedY, 0, 0); } /// /// 生成右侧的井支 /// /// 靶前偏移 /// 井间距 /// 水平段长度 /// 井支数量 /// 是否为右侧 private List CreateBranchs(double dDistance, double dBranchSpace, double dBranchLength, int nBranchCount, bool isRight) { List branchs = new List(); double dHeight = Parameter.BranchSpace * (nBranchCount - 1); // 先按井支角度为0计算 // 中心角 //double dAngleCenter = 0; int nHalfCount = (int)Math.Ceiling(nBranchCount * 0.5); for (int i = 0; i < nHalfCount; i++) { double dHeightOne = dHeight - (dBranchSpace * i * 2); //dAngleCenter = Math.Acos(((dDistance * dDistance) + (dDistance * dDistance) - (dHeightOne * dHeightOne)) / (2 * dDistance * dDistance)); //dAngleCenter *= 0.5; double dPtStartX = dDistance; // (dDistance * Math.Cos(dAngleCenter)); double dPtStartY = dHeightOne * 0.5; // (dDistance * Math.Sin(dAngleCenter)); double dPtEndX = dPtStartX + dBranchLength; double dPtEndY = dPtStartY; WellBranch wellBranch = new WellBranch(); wellBranch.PointStart = new DrawerPoint(string.Empty, dPtStartX, dPtStartY, -1E101, 0); wellBranch.PointEnd = new DrawerPoint(string.Empty, dPtEndX, dPtEndY, -1E101, 0); // 旋转 if (isRight == false) { wellBranch.PointStart.X = -wellBranch.PointStart.X; wellBranch.PointEnd.X = -wellBranch.PointEnd.X; } branchs.Add(wellBranch); } List lstDown = new List(); for (int i = nHalfCount; i < nBranchCount; i++) { WellBranch wellBranch = new WellBranch(); DrawerPoint ptOldStart = branchs[i - nHalfCount].PointStart; DrawerPoint ptOldEnd = branchs[i - nHalfCount].PointEnd; wellBranch.PointStart = new DrawerPoint(string.Empty, ptOldStart.X, -ptOldStart.Y, -1E101, 0); wellBranch.PointEnd = new DrawerPoint(string.Empty, ptOldEnd.X, -ptOldEnd.Y, -1E101, 0); lstDown.Add(wellBranch); //branchs.Insert(branchs.Count - 2, wellBranch); } lstDown.Reverse(); branchs.AddRange(lstDown); return branchs; } /// /// 坐标偏移 /// /// x偏移 /// y偏移 public new void Offset(double dX, double dY) { base.Offset(dX, dY); if (this.Parameter != null) { this.Parameter.WellPoint.Offset(dX, dY); } for (int i = 0; i < this.WellBranches.Count; i++) { this.WellBranches[i].PointEnd.Offset(dX, dY); this.WellBranches[i].PointStart.Offset(dX, dY); } } } /// /// The 井组参数. /// [TypeConverter(typeof(PropertySorter))] public class WellGroupParameter : INotifyPropertyChanged { public WellGroupParameter() { } private DrawerPoint wellPoint = new DrawerPoint(); //[RefreshProperties(RefreshProperties.All)] [XmlIgnore] [Category("\t\t水平井参数"), DisplayName("\t井点"), Browsable(true)] [TypeConverter(typeof(ExpandableObjectConverter))] public DrawerPoint WellPoint { get { return wellPoint; } set { if (!wellPoint.Equals(value)) { wellPoint = value; OnPropertyChanged(nameof(WellPoint)); } } } [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("井支角度"), Browsable(true), PropertyOrder(1)] public double BranchAngle { get; set; } = 0; // 井支角度 private int branchCountRight = 3; [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("右侧井支数"), Browsable(true), PropertyOrder(2)] public int BranchCountRight { get { return branchCountRight; } set { if (branchCountRight != value) { branchCountRight = value; OnPropertyChanged(nameof(BranchCountRight)); } } } [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("右侧垂直靶前距"), Browsable(true), PropertyOrder(3)] public double BranchDistanceRight { get; set; } = 500; // 垂直靶前距 private int branchCountLeft = 3; [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("左侧井支数"), Browsable(true), PropertyOrder(4)] public int BranchCountLeft { get { return branchCountLeft; } set { if (branchCountLeft != value) { branchCountLeft = value; OnPropertyChanged(nameof(BranchCountLeft)); } } } [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("左侧垂直靶前距"), Browsable(true), PropertyOrder(5)] public double BranchDistanceLeft { get; set; } = 500; // 垂直靶前距 [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("水平井段长度"), Browsable(true), PropertyOrder(6)] public double BranchLength { get; set; } = 1800; // 水平井段长度 [XmlAttribute] [Category("\t\t水平井参数"), DisplayName("井支间距"), Browsable(true), PropertyOrder(7)] public double BranchSpace { get; set; } = 300; // 井间距 public WellGroupParameter Clone() { WellGroupParameter other = new WellGroupParameter(); other.BranchCountRight = this.BranchCountRight; other.BranchCountLeft = this.BranchCountLeft; other.BranchAngle = this.BranchAngle; other.BranchDistanceLeft = this.BranchDistanceLeft; other.BranchDistanceRight = this.BranchDistanceRight; other.BranchLength = this.BranchLength; other.BranchSpace = this.BranchSpace; DrawerPoint pt = new DrawerPoint(); pt.X = this.WellPoint.X; pt.Y = this.WellPoint.Y; pt.Z = this.WellPoint.Z; if (this.WellPoint.Name != null) { pt.Name = this.WellPoint.Name.Clone().ToString(); } if (this.WellPoint.Layer != null) { pt.Layer = this.WellPoint.Layer.Clone().ToString(); } other.WellPoint = pt; return other; } public event PropertyChangedEventHandler PropertyChanged; public virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } /// /// 井支 /// public class WellBranch { public WellBranch() { } /// /// 入靶点 /// public DrawerPoint PointStart { get; set; } /// /// 出靶点 /// public DrawerPoint PointEnd { get; set; } [XmlElement(Type = typeof(DrawerCurveStyle), ElementName = "HowToViewCurve")] public List LineStyles { get; set; } [XmlElement(Type = typeof(DrawerPointStyle), ElementName = "HowToViewPoint")] public List PointStyles { get; set; } //public DrawerCurveStyle OffsetLineStyle { get; set; } //public DrawerCurveStyle HorizonLineStyle { get; set; } } }