private List <Wire> DivideWirePerCeilingPanel(Wire wire) { var wires = new List <Wire>(); //ロール長を計算し直すので初期化 wire.RolledLengthParent = 0; wire.RolledLengthChild = 0; wire.RolledWireParents = new List <Wire>(); wire.RolledWireChildren = new List <Wire>(); //床下配線or天井設置なし配線は分割しない if (wire.IsNotInstalledCeiling || wire.IsUnderfloor) { return new List <Wire> { wire } } ; var candidatePanels = this.CeilingPanels.FindAll(p => wire.IsOn(p)); if (candidatePanels.Count == 0) { return new List <Wire> { wire } } ; var startParam = AutoCad.Db.Curve.GetParameter(wire.ObjectId, wire.StartPoint); //ワイヤーとパネルの交点をまとめる。 var crossPoints = new List <PointD>(); //パネル同士がぴったり接している場合は同じ座標が交点に入るので削除する。 foreach (var panel in candidatePanels) { var points = AutoCad.Db.Entity.GetIntersect2D(panel.ObjectId, wire.ObjectId); foreach (var point in points) { if (crossPoints.Exists(p => p.X == point.X && p.Y == point.Y)) { continue; } crossPoints.Add(point); } } //一枚のパネルで完結しているワイヤーはそのまま返す。 if (crossPoints.Count == 0) { wire.CeilingPanel = candidatePanels[0]; wires.Add(wire); return(wires); } var parameters = new List <double>(); foreach (var point in crossPoints) { var parameter = AutoCad.Db.Curve.GetParameter(wire.ObjectId, point); parameters.Add(parameter); } //交点を配線の始点から近い順に並び変える。 parameters.Sort((p, q) => p.CompareTo(q)); var tempWireIds = new List <int>(); //ここで、ワイヤーの長さを算出している。 //作成した余計な線は必ず削除するよ! try { tempWireIds = AutoCad.Db.Polyline.GetSplitCurves(wire.ObjectId, parameters); var divideWires = new List <Wire>(); foreach (var wireId in tempWireIds) { var divideWire = new Wire(wireId, wire); var panel = candidatePanels.Find(p => divideWire.IsIn(p)); if (panel == null) { divideWire.CeilingPanel = null; } else { divideWire.CeilingPanel = panel; } divideWires.Add(divideWire); } wires.AddRange(divideWires); } finally { if (tempWireIds.Count != 0) { tempWireIds.ForEach(p => AutoCad.Db.Polyline.Erase(p)); } } return(wires); }