コード例 #1
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());
            }
        }