/// <summary>
/// Set bits in a BitMask of MSElementType.
/// <remarks>Mechanics of resizing a Bitmask shown by Robert Hook on Be Communities.</remarks>
/// </summary>
/// <param name="types">Array of MSElementType values</param>
/// <returns>BitMask</returns>
        private static BDPN.BitMask SetElementTypeBitMask(BDPN.MSElementType[] types)
        {
            BDPN.MSElementType largestType = Largest(types);
            uint bmSize = 1 + (uint)largestType;

            bmSize = (bmSize + 7) / 8;
            bmSize = (bmSize * 16) - 15;
            BDPN.BitMask bitMask = new BDPN.BitMask(false);
            bitMask.EnsureCapacity(bmSize + 1);
            foreach (var type in types)
            {
                bitMask.SetBit((uint)type - 1, true);
            }
            return(bitMask);
        }
Esempio n. 2
0
        public static void LinestringUnite(string unparsed)
        {
            BD.ScanCriteria sc = new BD.ScanCriteria();
            sc.SetModelRef(Program.GetActiveDgnModelRef());
            BD.BitMask bm = new Bentley.DgnPlatformNET.BitMask(true);
            bm.Set((uint)BD.MSElementType.LineString);
            bm.Set((uint)BD.MSElementType.ComplexString);
            sc.SetElementTypeTest(bm);

            var cvlist = new List <BG.CurveVector>();

            sc.Scan((ele, model) =>
            {
                if (ele.ElementType == BD.MSElementType.LineString)
                {
                    var stringEle = ele as BDE.LineStringElement;
                    cvlist.Add(stringEle.GetCurveVector());
                }
                if (ele.ElementType == BD.MSElementType.ComplexString)
                {
                    var complexstring = ele as BDE.ComplexStringElement;
                    cvlist.Add(complexstring.AsCurvePathEdit().GetCurveVector());
                }
                return(BD.StatusInt.Success);
            });
            var results = new List <BG.CurveVector>();

            if (cvlist.Count > 0)
            {
                for (int i = 0; i < cvlist.Count - 1; i++)
                {
                    for (int j = i + 1; j < cvlist.Count; j++)
                    {
                        var unitecv = BG.CurveVector.AreaUnion(cvlist[i], cvlist[j]);
                        if (unitecv != null)
                        {
                            results.Add(unitecv);
                        }
                    }
                }
            }
        }
Esempio n. 3
0
        public void Add()
        {
            try
            {
                if (SelectedDgnLevel == null)
                {
                    MessageBox.Show("未选择线段所在图层\n请重新选择图层", "未选择图层", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
                //扫描图中的线段
                BD.ScanCriteria sc = new Bentley.DgnPlatformNET.ScanCriteria();
                sc.SetModelRef(Program.GetActiveDgnModelRef());
                BD.BitMask bm = new BD.BitMask(true);
                bm.Set((uint)BD.MSElementType.Line);
                sc.SetElementTypeTest(bm);

                var elelist = new List <BDE.Element>();
                sc.Scan((ele, dgnmodel) =>
                {
                    var level = Program.GetActiveDgnModel().GetLevelCache().GetLevel(ele.LevelId, true);
                    if (ele.ElementType == BD.MSElementType.Line && ele.LevelId == SelectedDgnLevel.LevelId)
                    {
                        elelist.Add(ele);
                    }
                    return(BD.StatusInt.Success);
                });
                if (elelist.Count == 0)
                {
                    MessageBox.Show("所选图层中不存在线段元素\n请重新选择图层或绘制代表桩的线段", "所选图层无线段", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                PileFactory pilefactory = null;

                var pileproplist = new List <IPileProperty>();
                var pilenamelist = new List <string>();
                var pileIdlist   = new List <long>();

                switch (SelectedPileType)
                {
                case PileType.Solid:
                    pilefactory = new SolidPileFactory(GammaR);
                    foreach (var pile in elelist)
                    {
                        //BG.DRange3d range;
                        //((BDE.LineElement)pile).CalcElementRange(out range);//有问题

                        BG.DPoint3d startp, endp;
                        if (!((BDE.LineElement)pile).GetCurveVector().GetStartEnd(out startp, out endp))
                        {
                            System.Windows.Forms.MessageBox.Show($"无法获取Pile ID:{pile.ElementId}的起始点和终点");
                            return;
                        }
                        switch (SelectedPileCrossSectionType)
                        {
                        case SoildPileCrossSectionType.SquareWithRoundHole:
                            pileproplist.Add(new SquareWithRoundHolePileGeometry()
                            {
                                PileDiameter = this.PileDiameter, PileInnerDiameter = this.PileInnerDiameter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = startp.DPoint3dToPoint3d(1e-4), PileBottomPoint = endp.DPoint3dToPoint3d(1e-4)
                            });
                            break;

                        case SoildPileCrossSectionType.Square:
                            pileproplist.Add(new SquarePileGeometry()
                            {
                                PileDiameter = this.PileDiameter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = startp.DPoint3dToPoint3d(1e-4), PileBottomPoint = endp.DPoint3dToPoint3d(1e-4)
                            });
                            break;

                        case SoildPileCrossSectionType.Polygon:
                            pileproplist.Add(new PolygonPileGeometry()
                            {
                                CrossSectionArea = this.PolygonCrossSectionArea, PileCrossSectionPerimeter = this.PolygonCrossSectionPerimeter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = startp.DPoint3dToPoint3d(1e-4), PileBottomPoint = endp.DPoint3dToPoint3d(1e-4)
                            });
                            break;
                        }

                        var    pilecodereaddatablock = pile.GetLinkage((ushort)BD.ElementLinkageId.String);
                        string pilename = string.Empty;
                        if (null != pilecodereaddatablock)
                        {
                            //throw new NotSupportedException($"Pile Id:{pile.ElementId} doesn't contain pilecode linkage");
                            pilename = pilecodereaddatablock.ReadString();
                        }
                        else
                        {
                            pilename = pile.Description + " ID:" + pile.ElementId.ToString();
                        }
                        pilenamelist.Add(PileName + pilename);
                        pileIdlist.Add(pile.ElementId);
                    }
                    break;

                case PileType.SteelAndPercastConcrete:
                    pilefactory = new SteelAndPercastConcretePileFactory(GammaR, Eta);
                    foreach (var pile in elelist)
                    {
                        //BG.DRange3d range;
                        //((BDE.LineElement)pile).CalcElementRange(out range);

                        BG.DPoint3d startp, endp;
                        if (!((BDE.LineElement)pile).GetCurveVector().GetStartEnd(out startp, out endp))
                        {
                            System.Windows.Forms.MessageBox.Show($"无法获取Pile ID:{pile.ElementId}的起始点和终点");
                            return;
                        }
                        pileproplist.Add(new AnnularPileGeometry()
                        {
                            PileDiameter = this.PileDiameter, PileInnerDiameter = this.PileInnerDiameter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = startp.DPoint3dToPoint3d(1e-4), PileBottomPoint = endp.DPoint3dToPoint3d(1e-4)
                        });

                        var    pilecodereaddatablock = pile.GetLinkage((ushort)BD.ElementLinkageId.String);
                        string pilename = string.Empty;
                        if (null != pilecodereaddatablock)
                        {
                            //throw new NotSupportedException($"Pile Id:{pile.ElementId} doesn't contain pilecode linkage");
                            pilename = pilecodereaddatablock.ReadString();
                        }
                        pilenamelist.Add(PileName + pilename);
                        pileIdlist.Add(pile.ElementId);
                    }
                    break;
                    //case PileType.Filling:
                    //    pilefactory = new FillingPileFactory();
                    //    break;
                    //case PileType.Socketed:
                    //    pilefactory = new SocketedPileFactory();
                    //    break;
                    //case PileType.PostgroutingFilling:
                    //    pilefactory = new PostgroutingFillingPileFactory();
                    //    break;
                }

                //foreach (var pile in elelist)
                //{
                //    BG.DRange3d range;
                //    ((BDE.LineElement)pile).CalcElementRange(out range);
                //    switch (SelectedPileCrossSectionType)
                //    {
                //        case PileCrossSectionType.Roundness:
                //            pileproplist.Add(new RoundnessPileGeometry() { PileDiameter = this.PileDiameter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = range.High.DPoint3dToPoint3d(1e-4), PileBottomPoint = range.Low.DPoint3dToPoint3d(1e-4) });
                //            break;
                //        case PileCrossSectionType.Square:
                //            pileproplist.Add(new SquarePileGeometry() { PileDiameter = this.PileDiameter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = range.High.DPoint3dToPoint3d(1e-4), PileBottomPoint = range.Low.DPoint3dToPoint3d(1e-4) });
                //            break;
                //        case PileCrossSectionType.Annular:
                //            pileproplist.Add(new AnnularPileGeometry() { PileDiameter = this.PileDiameter, PileInnerDiameter = this.PileInnerDiameter, PileWeight = this.PileWeight, PileUnderWaterWeight = this.PileUnderwaterWeight, WaterLevel = WaterLevel, PileTopPoint = range.High.DPoint3dToPoint3d(1e-4), PileBottomPoint = range.Low.DPoint3dToPoint3d(1e-4) });
                //            break;
                //    }
                //    pilenamelist.Add(PileName + pile.GetLinkage((ushort)BD.ElementLinkageId.String).ReadString());
                //    pileIdlist.Add(pile.ElementId);
                //}
                var templist = pilefactory?.CreateNewPileArray(pileproplist.ToArray(), pilenamelist.ToArray(), pileIdlist.ToArray());
                Piles.AddRange(templist);

                CloseAction();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
 /// <summary>
 /// Given an array of MSElementType, create a Bitmask for the scanner.
 /// </summary>
 public static BDPN.ScanCriteria AddElementTypes(this BDPN.ScanCriteria criteria, params BDPN.MSElementType[] types)
 {
     BDPN.BitMask bitMask = SetElementTypeBitMask(types);
     criteria.SetElementTypeTest(bitMask);
     return(criteria);
 }