using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GrxCAD.DatabaseServices;
using GrxCAD.Geometry;
using GrxCAD.ApplicationServices;
using GrxCAD.EditorInput;
using System.Windows.Forms;
namespace HCTools
{
class Connect
{
Point3dCollection joinpoint = new Point3dCollection();//连接点
#region 连接
///
/// 连接线
///
public void joinplline()
{
ObjectId[] line = BasicFunction.getPll();//获取待连接线
if (line == null)
return;
//遍历比较待连接线,连接高程相同的两等高线
Database db = HostApplicationServices.WorkingDatabase;
DocumentLock doclock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
if (line.Length == 1)
{
ed.WriteMessage("请选择另一条连接线");
return;
}
try
{
Entity entity1 = line[0].GetObject(OpenMode.ForWrite)as Entity;
Entity entity2 = line[1].GetObject(OpenMode.ForWrite) as Entity;
if (entity1 is Polyline2d && entity2 is Polyline)
{
Polyline2d pll1 = (Polyline2d)entity1;
Polyline pll2 = (Polyline)trans.GetObject(entity2.Id, OpenMode.ForWrite);
pll2.Elevation = pll1.Elevation;
Calculate(pll1.StartPoint, pll1.EndPoint, pll2.StartPoint, pll2.EndPoint);
Polyline pline = new Polyline();
pline.AddVertexAt(0, new Point2d(joinpoint[0].X, joinpoint[0].Y), 0, 0, 0);
pline.AddVertexAt(1, new Point2d(joinpoint[1].X, joinpoint[1].Y), 0, 0, 0);//创建连接线
if (pll2.Elevation == pll1.Elevation)
{
//pll1.JoinEntity(pline);//浩辰的JoinEntity函数会报enotemplementedyet,不知道原因。
Polyline pll_temp = PllConn(pll2, pline);
//pll1.JoinEntity(pll2);
Polyline pll_final = Pllpll2d(pll_temp, pll1, trans);
pll1.Erase();
pll2.Erase();
BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
btr.AppendEntity(pll_final);
trans.AddNewlyCreatedDBObject(pll_final, true);
}
else
MessageBox.Show("两线高程不一致!", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
}
else if (entity1 is Polyline && entity2 is Polyline2d)
{
Polyline pll1 = (Polyline)entity1;
Polyline2d pll2 = (Polyline2d)entity2;
Calculate(pll1.StartPoint, pll1.EndPoint, pll2.StartPoint, pll2.EndPoint);
Polyline pline = new Polyline();
pline.AddVertexAt(0, new Point2d(joinpoint[0].X, joinpoint[0].Y), 0, 0, 0);
pline.AddVertexAt(1, new Point2d(joinpoint[1].X, joinpoint[1].Y), 0, 0, 0);//创建连接线
if (pll2.Elevation == pll1.Elevation)
{
//pll1.JoinEntity(pline);//浩辰的JoinEntity函数会报enotemplementedyet,不知道原因。
Polyline pll_temp = PllConn(pll1,pline);
//pll1.JoinEntity(pll2);
Polyline pll_final = Pllpll2d(pll_temp, pll2, trans);
pll1.Erase();
pll2.Erase();
BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
btr.AppendEntity(pll_final);
trans.AddNewlyCreatedDBObject(pll_final, true);
}
else
MessageBox.Show("两线高程不一致!", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
}
else if (entity1 is Polyline2d && entity2 is Polyline2d)
{
Polyline2d pll1 = (Polyline2d)entity1;
Polyline2d pll2 = (Polyline2d)entity2;
Calculate(pll1.StartPoint, pll1.EndPoint, pll2.StartPoint, pll2.EndPoint);
Point3dCollection pos = new Point3dCollection{joinpoint[0], joinpoint[1]};
DoubleCollection doubles = new DoubleCollection{0,0,0,0};
Polyline2d pline = new Polyline2d(Poly2dType.SimplePoly, pos, 0, false, 0, 0, doubles);
BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
btr.AppendEntity(pline);
trans.AddNewlyCreatedDBObject(pline, true);
//pline.AddVertexAt(0, new Point2d(joinpoint[0].X, joinpoint[0].Y), 0, 0, 0);
//pline.AddVertexAt(1, new Point2d(joinpoint[1].X, joinpoint[1].Y), 0, 0, 0);//创建连接线
if (pll2.Elevation == pll1.Elevation)
{
Polyline2d pll_temp = Pll2dConn(pll1, pline,trans);
btr.AppendEntity(pll_temp);
trans.AddNewlyCreatedDBObject(pll_temp, true);
//pll1.JoinEntity(pline);
//pll1.JoinEntity(pll2);
Polyline2d pll_final = Pll2dConn(pll_temp, pll2,trans);
pll1.Erase();
pline.Erase();
pll2.Erase();
pll_temp.Erase();
btr.AppendEntity(pll_final);
trans.AddNewlyCreatedDBObject(pll_final, true);
}
else
MessageBox.Show("两线高程不一致!", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
}
else
{
Polyline pll1 = (Polyline)entity1;
Polyline pll2 = (Polyline)entity2;
Calculate(pll1.StartPoint, pll1.EndPoint, pll2.StartPoint, pll2.EndPoint);
Polyline pline = new Polyline();
pline.AddVertexAt(0, new Point2d(joinpoint[0].X, joinpoint[0].Y), 0, 0, 0);
pline.AddVertexAt(1, new Point2d(joinpoint[1].X, joinpoint[1].Y), 0, 0, 0);//创建连接线
if (pll2.Elevation == pll1.Elevation)
{
//pll1.JoinEntity(pline);//浩辰的JoinEntity函数会报enotemplementedyet,不知道原因。
Polyline pll_temp = PllConn(pll1, pline);
//pll1.JoinEntity(pll2);
Polyline pll_final = PllConn(pll_temp, pll2);
pll1.Erase();
pll2.Erase();
BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
btr.AppendEntity(pll_final);
trans.AddNewlyCreatedDBObject(pll_final, true);
}
else
MessageBox.Show("两线高程不一致!", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
}
trans.Commit();
}
catch (GrxCAD.Runtime.Exception ex)
{
string str = ex.ToString();
GrxCAD.ApplicationServices.Application.ShowAlertDialog(str);
}
}
}
///
/// 计算获得连接点
///
private Point3dCollection Calculate(Point3d startpt1, Point3d endpt1, Point3d startpt2, Point3d endpt2)
{
Double[] distance=new Double[4];
joinpoint.Clear();
int i = 0;
//两线段四个端点之间的距离
distance[0] = Math.Sqrt(Math.Pow((startpt1.X - startpt2.X), 2) + Math.Pow((startpt1.Y - startpt2.Y), 2));
distance[1] = Math.Sqrt(Math.Pow((startpt1.X - endpt2.X), 2) + Math.Pow((startpt1.Y - endpt2.Y), 2));
distance[2] = Math.Sqrt(Math.Pow((endpt1.X - startpt2.X), 2) + Math.Pow((endpt1.Y - startpt2.Y), 2));
distance[3] = Math.Sqrt(Math.Pow((endpt1.X - endpt2.X), 2) + Math.Pow((endpt1.Y - endpt2.Y), 2));
//比较获取最小的距离,得到连接点
for (i = 0; i < distance.Length; i++)
{
if (distance[i] == distance.Min())
break;
}
switch (i.ToString())
{
case "0":
joinpoint.Add(startpt1);
joinpoint.Add(startpt2);
break;
case "1":
joinpoint.Add(startpt1);
joinpoint.Add(endpt2);
break;
case "2":
joinpoint.Add(endpt1);
joinpoint.Add(startpt2);
break;
case "3":
joinpoint.Add(endpt1);
joinpoint.Add(endpt2);
break;
}
return joinpoint;
}
///
/// 连接两条线(两条都是Polyline)
///
private Polyline PllConn(Polyline pll1, Polyline pll2)
{
List pllpt = new List();
List pll1pt = new List();
for (int i = 0; i < pll1.NumberOfVertices; i++)
{
pllpt.Add(pll1.GetPoint2dAt(i));
}
for (int i = 0; i < pll2.NumberOfVertices; i++)
{
pll1pt.Add(pll2.GetPoint2dAt(i));
}
//if (pllpt[pllpt.Count - 1] != pll1pt[pll1pt.Count - 1])
// pllpt.Reverse();
//else if (pllpt[0] != pll1pt[0])
// pll1pt.Reverse();
if (pllpt[pllpt.Count - 1] == pll1pt[pll1pt.Count - 1])
pll1pt.Reverse();
else if (pllpt[0] == pll1pt[pll1pt.Count - 1])
{
pllpt.Reverse();
pll1pt.Reverse();
}
else if (pllpt[0] == pll1pt[0])
pllpt.Reverse();
for (int i = 0; i < pll1pt.Count; i++)
{
if (pllpt.Contains(pll1pt[i]))
continue;
else
pllpt.Add(pll1pt[i]);
}
Polyline pline = new Polyline();
for (int i = 0; i < pllpt.Count; i++)
{
pline.AddVertexAt(i, new Point2d(pllpt[i].X, pllpt[i].Y), 0, 0, 0);
}
pline.Elevation = pll1.Elevation;
pline.LinetypeId = pll1.LinetypeId;
pline.Color = pll1.Color;
pline.Layer = pll1.Layer;
return pline;
}
///
/// 连接两条线(两条都是Polyline2d)
///
private Polyline2d Pll2dConn(Polyline2d pll1, Polyline2d pll2, Transaction tr)
{
List pllpt = new List();
List pll1pt = new List();
List bulgeList = new List();//存凸度
List bulgeList1 = new List();
Point3dCollection ptcoll = new Point3dCollection();
DoubleCollection dbcoll = new DoubleCollection();
foreach(ObjectId id in pll1)
{
Vertex2d vx = (Vertex2d)tr.GetObject(id, OpenMode.ForRead);
if (vx.VertexType != Vertex2dType.SplineControlVertex)
{
pllpt.Add(vx.Position);
bulgeList.Add(vx.Bulge);
}
}
foreach (ObjectId id in pll2)
{
Vertex2d vx = (Vertex2d)tr.GetObject(id, OpenMode.ForRead);
if (vx.VertexType != Vertex2dType.SplineControlVertex)
{
pll1pt.Add(vx.Position);
bulgeList1.Add(vx.Bulge);
}
}
//if (pllpt[pllpt.Count - 1] != pll1pt[pll1pt.Count - 1])
//{
// pllpt.Reverse();
// bulgeList.Reverse();
//}
//else if (pllpt[0] != pll1pt[0])
//{
// pll1pt.Reverse();
// bulgeList1.Reverse();
//}
if (pllpt[pllpt.Count - 1] == pll1pt[pll1pt.Count - 1])
{
pll1pt.Reverse();
bulgeList1.Reverse();
}
else if (pllpt[0] == pll1pt[pll1pt.Count - 1])
{
pllpt.Reverse();
pll1pt.Reverse();
bulgeList.Reverse();
bulgeList1.Reverse();
}
else if (pllpt[0] == pll1pt[0])
{
pllpt.Reverse();
bulgeList1.Reverse();
}
for (int i = 0; i < pll1pt.Count; i++)
{
if (pllpt.Contains(pll1pt[i]))
continue;
else
{
pllpt.Add(pll1pt[i]);
bulgeList.Add(bulgeList1[i]);
}
}
for (int i = 0; i < pllpt.Count; i++)
{
ptcoll.Add(pllpt[i]);
}
for (int i = 0; i < bulgeList.Count; i++)
{
dbcoll.Add(bulgeList[i]);
}
Polyline2d pline = new Polyline2d(pll1.PolyType, ptcoll, 0, false, 0, 0, dbcoll);
pline.Elevation = pll1.Elevation;
pline.LinetypeId = pll1.LinetypeId;
pline.Color = pll1.Color;
pline.Layer = pll1.Layer;
return pline;
}
///
/// 连接两条线(一条是Polyline,一条是Polyline2d,连接后的线为Polyline)
///
private Polyline Pllpll2d(Polyline pll1, Polyline2d pll2, Transaction tr)
{
List pllpt = new List();
List pll1pt = new List();
for (int i = 0; i < pll1.NumberOfVertices; i++)
{
pllpt.Add(pll1.GetPoint3dAt(i));
}
foreach (ObjectId id in pll2)
{
Vertex2d vx = (Vertex2d)tr.GetObject(id, OpenMode.ForRead);
if (vx.VertexType != Vertex2dType.SplineControlVertex)
{
pll1pt.Add(vx.Position);
}
}
//if (pllpt[pllpt.Count - 1] != pll1pt[pll1pt.Count - 1])
// pllpt.Reverse();
//else if (pllpt[0] != pll1pt[0])
// pll1pt.Reverse();
if (pllpt[pllpt.Count - 1] == pll1pt[pll1pt.Count - 1])
pll1pt.Reverse();
else if (pllpt[0] == pll1pt[pll1pt.Count - 1])
{
pllpt.Reverse();
pll1pt.Reverse();
}
else if (pllpt[0] == pll1pt[0])
pllpt.Reverse();
for (int i = 0; i < pll1pt.Count; i++)
{
if (pllpt.Contains(pll1pt[i]))
continue;
else
pllpt.Add(pll1pt[i]);
}
Polyline pline = new Polyline();
for (int i = 0; i < pllpt.Count; i++)
{
pline.AddVertexAt(i, new Point2d(pllpt[i].X, pllpt[i].Y), 0, 0, 0);
}
pline.Elevation = pll1.Elevation;
pline.LinetypeId = pll1.LinetypeId;
pline.Color = pll1.Color;
pline.Layer = pll1.Layer;
return pline;
}
#endregion
//public void conn()
//{
// ObjectIdCollection ids = getEntity();
// BlockReference br = null;
// Polyline pll = null;
// DBObjectCollection objcoll = new DBObjectCollection();
// string Brname = "";
// Point3d Brposition = new Point3d();
// Database db = HostApplicationServices.WorkingDatabase;
// DocumentLock doclock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
// Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
// using (Transaction trans = db.TransactionManager.StartTransaction())
// {
// foreach(ObjectId id in ids)
// {
// if (trans.GetObject(id, OpenMode.ForRead) is BlockReference)
// {
// br = trans.GetObject(id, OpenMode.ForRead)as BlockReference;
// Brname = br.Name;
// Brposition = br.Position;
// }
// if (trans.GetObject(id, OpenMode.ForRead) is Polyline)
// {
// pll = trans.GetObject(id, OpenMode.ForRead) as Polyline;
// }
// }
// br.Explode(objcoll);
// trans.Commit();
// }
// foreach (Entity ent in objcoll)
// {
// using (Transaction trans = db.TransactionManager.StartTransaction())
// {
// BlockTable blocktable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
// BlockTableRecord blocktablerecord = trans.GetObject(blocktable[BlockTableRecord.ModelSpace],
// OpenMode.ForWrite) as BlockTableRecord;
// blocktablerecord.AppendEntity(ent);
// trans.AddNewlyCreatedDBObject(ent, true);
// trans.Commit();
// }
// }
// doclock.Dispose();
//}
//private static ObjectIdCollection getEntity()
//{
// ObjectIdCollection ids = new ObjectIdCollection();
// Document doc = Application.DocumentManager.MdiActiveDocument;
// Database db = doc.Database;
// Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
// TypedValue[] value = new TypedValue[]
// {
// new TypedValue((int)DxfCode.Start,"Insert,POLYLINE"),
// };//设置筛选条件
// SelectionFilter filter = new SelectionFilter(value);
// //选择区域中全部对象
// //PromptSelectionResult psr = ed.SelectAll(filter);
// // 要求在图形区域中手动选择对象
// PromptSelectionResult psr = ed.GetSelection(filter);
// if (psr.Status == PromptStatus.OK)
// {
// using (Transaction trans = db.TransactionManager.StartTransaction())
// {
// SelectionSet ss = psr.Value;
// ids = new ObjectIdCollection(ss.GetObjectIds());
// trans.Commit();
// }
// }
// return ids;
//}
}
}