Untitled

 avatar
unknown
plain_text
2 months ago
2.3 kB
11
Indexable
  // 1. Разрезать стояк в точке вставки
  var splitId = Autodesk.Revit.DB.Plumbing.PlumbingUtils.BreakCurve(doc, pipe.Id, insertPt);
  doc.Regenerate();
  var lower = pipe;                                  // исходная = нижняя половина
  var upper = doc.GetElement(splitId) as Autodesk.Revit.DB.Plumbing.Pipe;

  // 2. Укоротить обе половины на fittingHalf = длина муфты / 2
  double fittingHalfFt = fittingLengthMm / 2.0 / 304.8;
  var lowerLC = lower.Location as LocationCurve;
  var upperLC = upper.Location as LocationCurve;
  var lowerEnd = lowerLC.Curve.GetEndPoint(1);
  var upperStart = upperLC.Curve.GetEndPoint(0);
  lowerLC.Curve = Line.CreateBound(lowerLC.Curve.GetEndPoint(0),
                                    lowerEnd - XYZ.BasisZ * fittingHalfFt);
  upperLC.Curve = Line.CreateBound(upperStart + XYZ.BasisZ * fittingHalfFt,
                                    upperLC.Curve.GetEndPoint(1));

  // 3. Активировать символ и ПОСТАВИТЬ с level (4-arg overload, БЕЗ host-pipe)
  if (!symbol.IsActive) symbol.Activate();
  var level = doc.GetElement(pipe.LevelId) as Level;
  var fi = doc.Create.NewFamilyInstance(
      insertPt, symbol, level,
      Autodesk.Revit.DB.Structure.StructuralType.NonStructural);

  // 4. Повернуть в вертикаль (КЛЮЧЕВОЙ шаг — без level шаг 4 silently ignored)
  ElementTransformUtils.RotateElement(doc, fi.Id,
      Line.CreateBound(insertPt, insertPt + XYZ.BasisY), -Math.PI/2);

  // 5. Соединить коннекторы муфты с коннекторами половинок
  Connector cFitBot = null, cFitTop = null;
  foreach (Connector c in fi.MEPModel.ConnectorManager.Connectors) {
      if (c.ConnectorType != ConnectorType.End) continue;
      if (cFitBot == null || c.Origin.Z < cFitBot.Origin.Z) cFitBot = cFitBot == null ? c : cFitBot;
      if (c.Origin.Z < (cFitBot?.Origin.Z ?? double.MaxValue)) cFitBot = c;
      if (cFitTop == null || c.Origin.Z > cFitTop.Origin.Z) cFitTop = c;
  }
  Connector cLow = FindEndAt(lower, lowerLC.Curve.GetEndPoint(1));
  Connector cUpp = FindEndAt(upper, upperLC.Curve.GetEndPoint(0));
  cLow.ConnectTo(cFitBot);
  cFitTop.ConnectTo(cUpp);
Editor is loading...
Leave a Comment