IEnumerable <KeyValuePair <BspSegment, BspSegment> > SearchNearSegments(Curve2dBspTree bsptree) { var result = new HashSet <KeyValuePair <BspSegment, BspSegment> >(); SearchNearSegmentsSegmentsOfNode(bsptree.Root, result); return(result); }
public override void Check(IEnumerable <ObjectId> selectedObjectIds) { if (!selectedObjectIds.Any()) { return; } var originBspSegments = GetAllBspSegments(selectedObjectIds); var bspSegmentForCollisions = new List <BspSegmentForCollsion>(); foreach (var bspSegment in originBspSegments) { // 将每个segment向外扩,形成一个矩形,矩形的宽为tolerance,但为了保险再向外扩0.001 var bspSegments = BspSegmentForCollsion.CreateSegmentsForCollision(bspSegment, _tolerance / 2.0 + 0.001); bspSegmentForCollisions.AddRange(bspSegments); } var bsptree = new Curve2dBspTree(bspSegmentForCollisions); var nearSegments = SearchNearSegments(bsptree); var qualified = FilterNearSegments(nearSegments); // Post process for nearSegmentPairs _gaps = GetPolygonGapsFromSegmentPair(qualified); foreach (var curveSegment in originBspSegments) { curveSegment.Dispose(); } foreach (var bspSegmentForCollision in bspSegmentForCollisions) { bspSegmentForCollision.Dispose(); } }
public Curve2dBspBuilder(IEnumerable <BspSegment> segments, Transaction transaction) { if (segments == null || !segments.Any()) { throw new ArgumentNullException("segments"); } if (transaction == null) { throw new ArgumentNullException("transaction"); } _transaction = transaction; _bspTree = new Curve2dBspTree(segments); }
private void BuildBspTree(IEnumerable <ObjectId> allIds) { var allBspSegments = new List <BspSegment>(); foreach (var id in allIds) { var curve = _transaction.GetObject(id, OpenMode.ForRead) as Curve; if (curve == null) { continue; } var segments = CurveUtils.GetSegment2dsOfCurve(curve, _transaction); var bspSegments = segments.Select(it => new BspSegment() { EntityId = id, LineSegment = it }); allBspSegments.AddRange(bspSegments); } _bspTree = new Curve2dBspTree(allBspSegments); }