internal void method_0(ObjectId[] objectId_0, ObjectId[] objectId_1, CoordinateSystem coordinateSystem_0) { Editor editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; Database workingDatabase = HostApplicationServices.WorkingDatabase; ProgressMeter progressMeter = new ProgressMeter(); MessageFilter messageFilter = new MessageFilter(); System.Windows.Forms.Application.AddMessageFilter(messageFilter); int num = 0; int num2 = 0; try { using (Transaction transaction = workingDatabase.TransactionManager.StartTransaction()) { progressMeter.SetLimit(objectId_0.Length + objectId_1.Length); if ((double)objectId_0.Length > 10000.0 || (double)objectId_1.Length > 10000.0) { progressMeter.Start("Interpolating..."); } DBManager.SetEpsilon(); CoordinateTransformator coordinateTransformator = new CoordinateTransformator(CoordinateSystem.Global(), coordinateSystem_0); CoordinateTransformator inverseTransformation = coordinateTransformator.GetInverseTransformation(); BlockTable blockTable = (BlockTable)transaction.GetObject(workingDatabase.BlockTableId, (OpenMode)1); BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], (OpenMode)1); ObjectId layerId = DBManager.CurrentLayerId(); List <IdPoint> list = new List <IdPoint>(); for (int i = 0; i < objectId_0.Length; i++) { DBPoint dbPoint = (DBPoint)transaction.GetObject(objectId_0[i], (OpenMode)1, true); IdPoint idPoint = new IdPoint(dbPoint); idPoint.IsValid = false; coordinateTransformator.Transform(idPoint.Point); idPoint.Point.Z = double.NaN; list.Add(idPoint); progressMeter.MeterProgress(); } list.Sort(); List <Triangle> list2 = Conversions.ToCeometricAcDbTriangleList(objectId_1); for (int j = 0; j < list2.Count; j++) { progressMeter.MeterProgress(); messageFilter.CheckMessageFilter((long)j, 1000); Triangle triangle = list2[j]; coordinateTransformator.Transform(triangle); double minimumX = triangle.MinimumX; double maximumX = triangle.MaximumX; double minimumY = triangle.MinimumY; double maximumY = triangle.MaximumY; int num3 = Math.Abs(list.BinarySearch(new IdPoint(new Point(minimumX, 0.0, 0.0), null))); int num4 = Math.Abs(list.BinarySearch(new IdPoint(new Point(maximumX, 0.0, 0.0), null))); num3 = Math.Max(num3 - 1, 0); num4 = Math.Min(num4 + 1, list.Count - 1); for (int k = num4; k >= num3; k--) { Point point = list[k].Point; if (point.X <= maximumX && point.X >= minimumX && point.Y <= maximumY && point.Y >= minimumY) { double num5 = Predicate.InTriangle2dExact(triangle.Vertex1, triangle.Vertex2, triangle.Vertex3, point); num5 = Predicate.Orientatation2dExact(triangle) * num5; if (num5 >= 0.0) { double num6 = PointProjection.smethod_0(triangle, point); if (double.IsNaN(num6)) { num++; } else { double x = point.X; double y = point.Y; if (point.Z != double.NaN) { if (PointProjection.string_5 == "H") { if (num6 < point.Z) { goto IL_3FC; } } else if (num6 > point.Z) { goto IL_3FC; } } point.Z = num6; inverseTransformation.Transform(ref x, ref y, ref num6); DBPoint dBPoint = new DBPoint(new Point3d(x, y, num6)); if (PointProjection.string_3 == "C") { dBPoint.LayerId = (layerId); } else if (PointProjection.string_3 == "F") { dBPoint.SetPropertiesFrom(triangle.AcDbFace); } else if (PointProjection.string_3 == "P") { dBPoint.SetPropertiesFrom(list[k].DBPoint); } list[k].IsValid = true; list[k].DBPoint2 = dBPoint; if (PointProjection.string_2 == "Y" & !list[k].DBPoint.IsErased) { list[k].DBPoint.Erase(); } } } } IL_3FC :; } } for (int l = 0; l < list.Count; l++) { if (list[l].IsValid) { blockTableRecord.AppendEntity(list[l].DBPoint2); transaction.AddNewlyCreatedDBObject(list[l].DBPoint2, true); num2++; } } transaction.Commit(); editor.WriteMessage("\nFailed interpolations : " + num); editor.WriteMessage("\nPoints outside surface: " + (objectId_0.Length - num2 - num).ToString()); editor.WriteMessage("\nInterpolated points : " + num2.ToString()); } progressMeter.Stop(); } catch (System.Exception ex) { progressMeter.Stop(); throw; } }
private List <Edge> method_0(ObjectId[] objectId_0, ObjectId[] objectId_1, CoordinateSystem coordinateSystem_0, bool bool_0) { Editor editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; Database workingDatabase = HostApplicationServices.WorkingDatabase; ProgressMeter progressMeter = new ProgressMeter(); MessageFilter messageFilter = new MessageFilter(); System.Windows.Forms.Application.AddMessageFilter(messageFilter); int num = 0; int num2 = 0; int num3 = 0; IdEdgeList idEdgeList = new IdEdgeList(); List <Edge> list = new List <Edge>(); int num4 = DBManager.SetEpsilon(); int num5 = (int)Convert.ToInt16(Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("LUPREC").ToString()); num4 = Math.Min(num5 + 2, num4); double num6 = Math.Max(Math.Pow(10.0, (double)(-(double)num4)), Global.AbsoluteEpsilon); CoordinateTransformator coordinateTransformator = new CoordinateTransformator(CoordinateSystem.Global(), coordinateSystem_0); CoordinateTransformator inverseTransformation = coordinateTransformator.GetInverseTransformation(); List <Triangle> list2 = Conversions.ToCeometricAcDbTriangleList(objectId_1); using (Transaction transaction = workingDatabase.TransactionManager.StartTransaction()) { BlockTable blockTable = (BlockTable)transaction.GetObject(workingDatabase.BlockTableId, (OpenMode)1); BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], (OpenMode)1); ObjectId layerId = DBManager.CurrentLayerId(); DBManager.CurrentLayerName(); List <IdEdge> list3 = new List <IdEdge>(); double num7 = -1.7976931348623157E+308; for (int i = 0; i < objectId_0.Length; i++) { Autodesk.AutoCAD.DatabaseServices.Line line = (Autodesk.AutoCAD.DatabaseServices.Line)transaction.GetObject(objectId_0[i], (OpenMode)1, true); IdEdge idEdge = new IdEdge(line); if (LineProjection.string_0 == "Y" & !idEdge.Line.IsErased) { idEdge.Line.Erase(); } coordinateTransformator.Transform(idEdge.Edge); double num8 = idEdge.Edge.StartPoint.X - idEdge.Edge.EndPoint.X; double num9 = idEdge.Edge.StartPoint.Y - idEdge.Edge.EndPoint.Y; double num10 = Math.Sqrt(num8 * num8 + num9 * num9); if (Math.Abs(num8) > num7) { num7 = Math.Abs(num8); } if (num10 < Global.AbsoluteEpsilon) { num2++; } else { idEdge.SetMinMaxXY(); list3.Add(idEdge); } } list3.Sort(new CompareMin()); progressMeter.SetLimit(objectId_1.Length); if ((double)objectId_1.Length > 10000.0) { progressMeter.Start("Projecting lines..."); } try { for (int j = 0; j < list2.Count; j++) { progressMeter.MeterProgress(); messageFilter.CheckMessageFilter((long)j, 1000); Triangle triangle = list2[j]; coordinateTransformator.Transform(triangle); if (Math.Abs(triangle.NormalVector.Z) < Global.AbsoluteEpsilon) { num++; } else { double minimumX = triangle.MinimumX; double maximumX = triangle.MaximumX; double minimumY = triangle.MinimumY; double maximumY = triangle.MaximumY; IdEdge item = new IdEdge(new Edge(new Point(maximumX, minimumY, 0.0), new Point(maximumX + 1.0, minimumY, 0.0))); int num11 = list3.BinarySearch(item, new CompareMin()); if (num11 < 0) { num11 = ~num11; } IdEdge item2 = new IdEdge(new Edge(new Point(minimumX - num7, maximumY, 0.0), new Point(minimumX - num7 + 1.0, maximumY, 0.0))); int num12 = list3.BinarySearch(item2, new CompareMin()); if (num12 < 0) { num12 = ~num12; } try { for (int k = num12; k < num11; k++) { IdEdge idEdge2 = list3[k]; if (idEdge2.MinX <= maximumX && idEdge2.MinY <= maximumY && idEdge2.MaxX >= minimumX && idEdge2.MaxY >= minimumY) { Edge edge = idEdge2.Edge; double num13 = Predicate.InTriangle2dArbitraryExact(triangle.Vertex1, triangle.Vertex2, triangle.Vertex3, edge.StartPoint); double num14 = Predicate.InTriangle2dArbitraryExact(triangle.Vertex1, triangle.Vertex2, triangle.Vertex3, edge.EndPoint); Edge edge2 = new Edge(); if (!double.IsNaN(num14) && !double.IsNaN(num13)) { if (num14 == 1.0 && num13 == 1.0) { edge2 = edge; } else if (num13 == 1.0 && num14 == 0.0) { edge2 = edge; } else if (num13 == 0.0 && num14 == 1.0) { edge2 = edge; } else if (num13 == 0.0 && num14 == 0.0) { edge2 = edge; } else if (num13 == -1.0 && num14 == 1.0) { edge2 = this.method_1(edge, triangle, edge.EndPoint); } else if (num13 == 1.0 && num14 == -1.0) { edge2 = this.method_1(edge, triangle, edge.StartPoint); } else if (num13 == 0.0 && num14 == -1.0) { edge2 = this.method_2(edge, triangle, edge.StartPoint); } else if (num13 == -1.0 && num14 == 0.0) { edge2 = this.method_2(edge, triangle, edge.EndPoint); } else if (num13 == -1.0 && num14 == -1.0) { edge2 = this.method_3(edge, triangle); } if (!(edge2 == null)) { Edge edge3 = edge2.DeepCopy(); edge3.StartPoint.Z = PointProjection.smethod_0(triangle, edge3.StartPoint); edge3.EndPoint.Z = PointProjection.smethod_0(triangle, edge3.EndPoint); if (edge3.Length >= num6) { Edge edge4 = edge3.DeepCopy(); edge4.SwapSort(); edge4.StartPoint.X = (double)((float)edge4.StartPoint.X); edge4.StartPoint.Y = (double)((float)edge4.StartPoint.Y); edge4.StartPoint.Z = (double)((float)edge4.StartPoint.Z); edge4.EndPoint.X = (double)((float)edge4.EndPoint.X); edge4.EndPoint.Y = (double)((float)edge4.EndPoint.Y); edge4.EndPoint.Z = (double)((float)edge4.EndPoint.Z); if (!idEdgeList.ContainsKey(edge4)) { idEdgeList.Add(edge4, null); inverseTransformation.Transform(edge3); list.Add(edge3); if (bool_0) { Point3d point3d = new Point3d(edge3.StartPoint.X, edge3.StartPoint.Y, edge3.StartPoint.Z); //point3d..ctor(edge3.StartPoint.X, edge3.StartPoint.Y, edge3.StartPoint.Z); Point3d point3d2 = new Point3d(edge3.EndPoint.X, edge3.EndPoint.Y, edge3.EndPoint.Z); //point3d2..ctor(edge3.EndPoint.X, edge3.EndPoint.Y, edge3.EndPoint.Z); Autodesk.AutoCAD.DatabaseServices.Line line2 = new Autodesk.AutoCAD.DatabaseServices.Line(point3d, point3d2); if (LineProjection.string_1 == "C") { LayerTableRecord layerTableRecord = (LayerTableRecord)transaction.GetObject(triangle.AcDbFace.LayerId, (OpenMode)0); Color color = triangle.AcDbFace.Color; if (color.IsByLayer) { color = layerTableRecord.Color; } line2.SetPropertiesFrom(triangle.AcDbFace); line2.LayerId = (layerId); line2.Color = (color); } else if (LineProjection.string_1 == "F") { line2.SetPropertiesFrom(triangle.AcDbFace); } else if (LineProjection.string_1 == "L") { line2.SetPropertiesFrom(idEdge2.Line); } blockTableRecord.AppendEntity(line2); transaction.AddNewlyCreatedDBObject(line2, true); } } } } } } } } catch (System.Exception ex) { editor.WriteMessage("\n" + ex.Message); num3++; } } } } catch (System.Exception ex) { progressMeter.Stop(); throw; } transaction.Commit(); } progressMeter.Stop(); if (bool_0) { editor.WriteMessage("\nNumber of lines projected : " + idEdgeList.Count); editor.WriteMessage("\nNumber of failed faces : " + num3); editor.WriteMessage("\nFaces parallel to projection direction: " + num); editor.WriteMessage("\nLines parallel to projection direction: " + num2); } return(list); }