using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace placePillars.Place_Cables
public static (Line, ObjectId) IntersectingCables(Document doc, Editor ed, Database db, List<Line> lineList, Line innerLine, Line outerLine)
bool innerbackwars = false;
bool outerbackwars = false;
bool linebackwards = false;
double tolerance = 0.001;
List<Line> newCable = new List<Line>();
ObjectId cableIntersect = new ObjectId();
if (innerLine.EndPoint.X - innerLine.StartPoint.X < 0)
if (outerLine.EndPoint.X - outerLine.StartPoint.X < 0)
if (innerbackwars == false)
mInner = (innerLine.EndPoint.Y - innerLine.StartPoint.Y) / (innerLine.EndPoint.X - innerLine.StartPoint.X);
mInner = (innerLine.StartPoint.Y - innerLine.EndPoint.Y) / (innerLine.StartPoint.X - innerLine.EndPoint.X);
if (outerbackwars == false)
mOuter = (outerLine.EndPoint.Y - outerLine.StartPoint.Y) / (outerLine.EndPoint.X - outerLine.StartPoint.X);
mOuter = (outerLine.StartPoint.Y - outerLine.EndPoint.Y) / (outerLine.StartPoint.X - outerLine.EndPoint.X);
Double bInner = innerLine.StartPoint.Y - mInner * innerLine.StartPoint.X;
Double bOuter = outerLine.StartPoint.Y - mOuter * outerLine.StartPoint.X;
using (DocumentLock acLckDoc = doc.LockDocument())
using (Transaction acTrans = db.TransactionManager.StartTransaction())
Parallel.ForEach(lineList, (lineRecord) =>
if (lineRecord.EndPoint.X - lineRecord.StartPoint.X < 0)
if (linebackwards == false)
mBoundary = (lineRecord.EndPoint.Y - lineRecord.StartPoint.Y) / (lineRecord.EndPoint.X - lineRecord.StartPoint.X);
mBoundary = (lineRecord.StartPoint.Y - lineRecord.EndPoint.Y) / (lineRecord.StartPoint.X - lineRecord.EndPoint.X);
bBoundary = lineRecord.StartPoint.Y - mBoundary * lineRecord.StartPoint.X;
var x = mBoundary + mInner * -1;
var b = bBoundary * -1 + bInner;
if (x <= tolerance && x >= -tolerance)
double x1 = (float)b / (float)x;
x = mBoundary + mOuter * -1;
b = bBoundary * -1 + bOuter;
if (x <= tolerance && x >= -tolerance)
double x2 = (float)b / (float)x;
if (!double.IsInfinity(x1) && double.IsInfinity(x2))
if (innerbackwars == true)
if (x1 < innerLine.StartPoint.X && x1 > innerLine.EndPoint.X)
if (innerbackwars == false)
if (x1 > innerLine.StartPoint.X && x1 < innerLine.EndPoint.X)
if (double.IsInfinity(x1) && !double.IsInfinity(x2))
if (outerbackwars == false)
if (x2 < outerLine.StartPoint.X && x2 > outerLine.EndPoint.X)
if (outerbackwars == true)
if (x2 > outerLine.StartPoint.X && x2 < outerLine.EndPoint.X)
if ((inner == true && outer == false) || (inner == false && outer == true))
cableIntersect = outerLine.ObjectId;
cableIntersect = innerLine.ObjectId;
catch (System.Exception ex)
MessageBox.Show(ex.StackTrace);
MessageBox.Show(ex.Source);
return (newCable[0], cableIntersect);