/// <summary> /// /// </summary> /// <returns></returns> private FamilyInstance Connect(Transaction docTrans, Connector conCabinet, Connector conConduit) { // 找到设备的底面 XYZ cabLocation = conCabinet.Origin; PlanarFace bottomFace = GeoHelper.GetBottomPlanarFace(_cabinet.MepInstance); double bottomZ = bottomFace.Origin.Z; // 根据线管的位置与方向,以及设备中连接件的位置,得到此线管发出的射线与设备连接件的某竖向平面的交点 XYZ rayPoint = GetRayPoint(conConduit.CoordinateSystem, conCabinet.CoordinateSystem); XYZ verticalConduitTop = new XYZ(rayPoint.X, rayPoint.Y, cabLocation.Z); XYZ verticalConduitBottom = new XYZ(rayPoint.X, rayPoint.Y, bottomZ); // 判断是否能够成功地生成弯头 // (因为如果不能成功生成,在API的代码中也不会报错,而只是在Transaction.Commit时弹出一个消息框) double?outDiamter = _conduit.GetConduitOuterDiameter(); if (outDiamter == null) { throw new NullReferenceException("在线管中未找到参数“外径”"); } // ------------------------------------------------ // 要生成弯头所需要的最小的弯曲半径,如果弯头的半径大于此值,则不能成功生成弯头。 // 在生成弯头时,两边的线管如果被截断,则其截断后的长度不能为负,也不能为零,至少还要剩3mm(2.5 mm都不行)。 double minLengthOfVerticalConduit = UnitUtils.ConvertToInternalUnits(5, DisplayUnitType.DUT_MILLIMETERS); // 弯头对象除了圆弧段以外,其两端还各有一个线管段,其长度 = 线管外径。 double allowableRadius = cabLocation.Z - conConduit.Origin.Z - outDiamter.Value - minLengthOfVerticalConduit; double allowableRatio = allowableRadius / outDiamter.Value; // ------------------------------------------------ double?ratioInFamily = GetElbowRadiusRatio(docTrans, _conduit.ConduitIns); if (ratioInFamily == null) { throw new NullReferenceException("在线管中没有找到匹配的弯头对象"); } if (allowableRatio < ratioInFamily) { throw new InvalidOperationException(message: "线管当前所使用的弯头中的弯曲半径值过大,不能正常地生成弯头。" + "请换用其他的弯头,或者将将弯头中的实例参数“弯曲半径”由“管件外径 * " + ratioInFamily + "”修改为“管件外径 * " + allowableRatio + "”或更小的值。"); } // 生成设备内部的竖向线管 Conduit cd = Conduit.Create(_doc, _conduit.ConduitIns.GetTypeId(), verticalConduitBottom, verticalConduitTop, ElementId.InvalidElementId); MEPConduit mepCd = new MEPConduit(cd); // 调整线管直径到与选择的线管直径相同 double?diameter = _conduit.GetConduitDiameter(); if (diameter == null) { throw new NullReferenceException("在线管中未找到参数“直径(公称尺寸)”"); } mepCd.SetConduitDiameter(diameter.Value); // Connector conn_vert = cd.ConnectorManager.Lookup(0); // 生成弯头 FamilyInstance elbow = _doc.Create.NewElbowFitting(conn_vert, conConduit); return(elbow); }