Revit二开–三通支管提升
在Revit机电建模过程中,修改三通支管高度的时候很麻烦,通常我们需要删除三通然后修改支管高度然后,再将主管连接,最后将支管延伸至主管,由软件自动生成登高立管。
像这样子:
太麻烦了有木有?
其实我想这样子,设置好提升的高度差, 点一下支管自动升高。像下面这样子:
那么怎么一步到位呢,当然是用二开写个程序来实现啦。
- 以下就是实现支管提升的代码
/// <summary>
/// 管道三通支管提升
/// </summary>
[Transaction(TransactionMode.Manual)]
class Cmd_RaiseTeeBranch : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var uiapp = commandData.Application;
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
var sel = uidoc.Selection;
var acview = doc.ActiveView;
ValueSettingUI settingWin = new ValueSettingUI();
n:;
settingWin.ShowDialog();
var valuestring = settingWin.settingValue.Text;
var value = default(double);
var parseResult = double.TryParse(valuestring, out value);
if (!parseResult)
{
MessageBox.Show("数值错误,请重新输入");
settingWin.Hide();
goto n;
}
while (true)
{
try
{
var eleref = sel.PickObject(ObjectType.Element, doc.GetSelectionFilter(m => m is Pipe));
var pipe = eleref.GetElement(doc) as Pipe;
var pipecons = pipe.ConnectorManager.Connectors.Cast<Connector>();
var validcons = pipecons.Where(m =>
m.IsConnected && (m.ConnectorType == ConnectorType.End || m.ConnectorType == ConnectorType.Curve))
.ToList();
if (validcons.Count < 1) return Result.Cancelled;
var connectedPipeFittings = validcons.Select(m => m.GetConnectedCon().Owner).Cast<FamilyInstance>().Where(m => m != null);
//MessageBox.Show(connectedPipeFittings.Count().ToString());
var teeFitting = default(IEnumerable<FamilyInstance>);
teeFitting = connectedPipeFittings.Where(m => m.Symbol.Family.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE).AsValueString().Contains("三通")&&m.FacingOrientation.IsParallel(pipe.LocationLine().Direction));
if (teeFitting.Count() == 1)
{
var tee = teeFitting.FirstOrDefault();
var location = (tee.Location as LocationPoint).Point;
var facingdir = tee.FacingOrientation;
var handdir = tee.HandOrientation;
var anxisline = Line.CreateUnbound(location, handdir);
var updir = -facingdir.CrossProduct(handdir);
var newupdir = default(XYZ);
if (updir.AngleTo(XYZ.BasisZ) <= Math.PI / 2)
{
newupdir = updir;
}
else
{
newupdir = -updir;
}
var consOfTee = tee.MEPModel.ConnectorManager.Connectors.Cast<Connector>();
var branchCon = consOfTee.Where(m => m.CoordinateSystem.BasisZ.IsSameDirection(-facingdir)).FirstOrDefault();
var connectedconOfBranchCon = branchCon.GetConnectedCon();
Transaction ts = new Transaction(doc, "提升支管高度");
ts.Start();
branchCon.DisconnectFrom(connectedconOfBranchCon);
//改变支管高度
ElementTransformUtils.MoveElement(doc, pipe.Id, newupdir * value / 304.8);
//旋转Tee
ElementTransformUtils.RotateElement(doc, tee.Id, anxisline, facingdir.AngleOnPlaneTo(newupdir * (value) / Math.Abs(value), -handdir) );
doc.Regenerate();
var branchConPosition = branchCon.Origin;
var distance = branchConPosition.DistanceTo(pipe.LocationLine());
//新创建管道
var startpo = branchConPosition;
var endpo = startpo + newupdir * (value) / Math.Abs(value) * distance;
var newline = Line.CreateBound(startpo, endpo);
var newpipeid = ElementTransformUtils.CopyElement(doc, pipe.Id, new XYZ()).FirstOrDefault();
var newpipe = newpipeid.GetElement(doc) as Pipe;
(newpipe.Location as LocationCurve).Curve = newline;
foreach (Connector con in newpipe.ConnectorManager.Connectors)
{
var conorigin = con?.Origin;
if (conorigin == null) continue;
if (conorigin.IsAlmostEqualTo(branchConPosition))
{
con.ConnectTo(branchCon);
}
}
pipe.ElbowConnect(newpipe);
ts.Commit();
}
else if (teeFitting.Count() == 2)
{
}
}
catch (Exception e)
{
break;
}
}
return Result.Succeeded;
}
}