Ejemplo n.º 1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="cabinet">配电箱</param>
 /// <param name="conduit">线管</param>
 public ConduitFittingMEP(MEPElectricalEquipment cabinet, Conduit conduit)
 {
     _cabinet = cabinet;
     _doc     = cabinet.MepInstance.Document;
     _conduit = new MEPConduit(conduit);
 }
Ejemplo n.º 2
0
        /// <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);
        }