CAD C# 转换视角2

        [CommandMethod("loop", CommandFlags.UsePickSet)]
        public void 视角转换()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            // 获取用户的选择
            PromptSelectionResult psr = ed.SelectImplied();
            if (psr.Status != PromptStatus.OK)
            {
                psr = ed.GetSelection();
            }
            if (psr.Status != PromptStatus.OK)
            {
                ed.WriteMessage("没有选中任何对象。\n");
                return;
            }
          
            SelectionSet sSet = psr.Value;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                Extents3d totalExtents = new Extents3d();
                foreach (SelectedObject selObj in sSet)
                {
                    Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);

                    totalExtents.AddExtents(ent.GeometricExtents);

                }
              
                var 范围长 = totalExtents.MaxPoint.X - totalExtents.MinPoint.X;
                var 范围宽= totalExtents.MaxPoint.Y- totalExtents.MinPoint.Y;
                var 中点x = totalExtents.MinPoint.X + 范围长 / 2;
                var 中点y = totalExtents.MinPoint.Y + 范围宽 / 2;
                //PromptPointOptions ppo = new PromptPointOptions("\n选择点: ");
                //PromptPointResult ppr = ed.GetPoint(ppo);
                //var ppt = ppr.Value;
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
                BlockTableRecord space = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
                var 前一个selRes = ed.SelectCrossingWindow(totalExtents.MinPoint, totalExtents.MaxPoint);
              
               var 块集 = new List<((List<Entity>, Extents3d), string)>();
                double 比例值 = 6;
                int 扩张值 = 3;
                var 左下角块 = 左下角();
                var 左上角块 = 左上角();
                var 右上角块 = 右上角();
                var 右下角块 = 右下角();
               
               if(左下角块.Item1.Count!=0) 块集.Add((左下角块, "左下角"));
                if (左上角块.Item1.Count != 0) 块集.Add((左上角块, "左上角"));
                if (右上角块.Item1.Count != 0) 块集.Add((右上角块, "右上角"));
                if (右下角块.Item1.Count != 0) 块集.Add((右下角块, "右下角"));
                Debug.WriteLine("块数:" + 块集.Count);
           
            
                if (块集.Count == 2 && 左下角块.Item1.Count != 0 && 右上角块.Item1.Count != 0)
                {
                    
                    比例值 = 范围宽/(totalExtents.MaxPoint.Y-右上角块.Item2.MinPoint.Y) ;
                   
                    左上角块 = 左上角();
               
                    if (左上角块.Item1.Count != 0) 块集.Add((左上角块, "左上角"));
                    else { 
                    比例值 = 范围长/(右上角块.Item2.MinPoint.Y - totalExtents.MinPoint.Y) ;
                      
                        右下角块 = 右下角();
                    if (右下角块.Item1.Count != 0) 块集.Add((右下角块, "右下角"));
                    }
                    
                }
                else if (块集.Count == 2 && 左上角块.Item1.Count != 0 && 右下角块.Item1.Count != 0)
                {
                   
                    比例值 = 范围宽/(totalExtents.MaxPoint.Y - 左上角块.Item2.MinPoint.Y) ;
                    右上角块 = 右上角();
                
                    if (右上角块.Item1.Count != 0) 块集.Add((右上角块, "右上角"));
                    else
                    {
                        比例值 = 范围长/(左上角块.Item2.MinPoint.Y - totalExtents.MinPoint.Y) ;
                     
                        左下角块 = 左下角();
                        if (左下角块.Item1.Count != 0) 块集.Add((左下角块, "左下角"));
                    }
                }
             
               
                if (块集.Count == 3)
                {
                    if (!块集.Select(item => item.Item2).ToList().Contains("左下角"))
                    {
                        Vector3d displacement = new Vector3d(0, 范围宽, 0);
                        Matrix3d move = Matrix3d.Displacement(displacement);
                        右下角块.Item1.ForEach(i=>i.TransformBy(move));
                        Vector3d displacement2 = new Vector3d(范围长, 0, 0);
                        Matrix3d move2 = Matrix3d.Displacement(displacement2);
                        左上角块.Item1.ForEach(i => i.TransformBy(move2));
                    }
                    else if (!块集.Select(item => item.Item2).ToList().Contains("左上角"))
                    {
                        Vector3d displacement = new Vector3d(范围长, 0, 0);
                        Matrix3d move = Matrix3d.Displacement(displacement);
                        左下角块.Item1.ForEach(i => i.TransformBy(move));
                        Vector3d displacement2 = new Vector3d(0, -范围宽, 0);
                        Matrix3d move2 = Matrix3d.Displacement(displacement2);
                        右上角块.Item1.ForEach(i => i.TransformBy(move2));
                    }
                    else if (!块集.Select(item => item.Item2).ToList().Contains("右上角"))
                    {
                        Vector3d displacement = new Vector3d(0, -范围宽, 0);
                        Matrix3d move = Matrix3d.Displacement(displacement);
                        左上角块.Item1.ForEach(i => i.TransformBy(move));
                        Vector3d displacement2 = new Vector3d(-范围长, 0, 0);
                        Matrix3d move2 = Matrix3d.Displacement(displacement2);
                        右下角块.Item1.ForEach(i => i.TransformBy(move2));
                    }
                    else if (!块集.Select(item => item.Item2).ToList().Contains("右下角"))
                    {
                        Vector3d displacement = new Vector3d(0, 范围宽, 0);
                        Matrix3d move = Matrix3d.Displacement(displacement);
                        左下角块.Item1.ForEach(i => i.TransformBy(move)); 
                        Vector3d displacement2 = new Vector3d(-范围长, 0, 0);
                        Matrix3d move2 = Matrix3d.Displacement(displacement2);
                        右上角块.Item1.ForEach(i => i.TransformBy(move2));
                    }
                }
                else if (块集.Count == 2) {
                    if (块集.Select(item => item.Item2).ToList().Contains("左下角")
                        && 块集.Select(item => item.Item2).ToList().Contains("左上角")) {
                        Vector3d displacement = new Vector3d(0, 范围宽, 0);
                        Matrix3d move = Matrix3d.Displacement(displacement);
                        左下角块.Item1.ForEach(i => i.TransformBy(move));
                    }
                    if (块集.Select(item => item.Item2).ToList().Contains("右上角")
                    && 块集.Select(item => item.Item2).ToList().Contains("左上角"))
                    {
                        Vector3d displacement2 = new Vector3d(范围长, 0, 0);
                        Matrix3d move2 = Matrix3d.Displacement(displacement2);
                        左上角块.Item1.ForEach(i => i.TransformBy(move2));
                    }
                }
                创建块2(块集.Select(Item => Item.Item1.Item1).ToList());

               ( List<Entity>, Extents3d)左下角()
                { 
                Point3d 左下框1 = totalExtents.MinPoint;
                Point3d 左下框2 =new Point3d( totalExtents.MinPoint.X+ 范围长/ 比例值, totalExtents.MinPoint.Y+ 范围宽/ 比例值, 0);
                PromptSelectionResult selRes = ed.SelectCrossingWindow(左下框1, 左下框2);
                    if (selRes.Status != PromptStatus.OK) return (new List<Entity>(),new Extents3d());
                    Extents3d 左下框totalExtents = new Extents3d();

                foreach (SelectedObject selObj in selRes.Value)
                {
                    Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);

                    左下框totalExtents.AddExtents(ent.GeometricExtents);

                    }

                    do
                    {
                        前一个selRes = selRes;
                        左下框2 = new Point3d(左下框totalExtents.MaxPoint.X + 扩张值, 左下框totalExtents.MaxPoint.Y + 扩张值, 0);
                        selRes = ed.SelectCrossingWindow(左下框1, 左下框2);
                       左下框totalExtents = new Extents3d();
                        foreach (SelectedObject selObj in selRes.Value)
                        {
                            Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);
                            左下框totalExtents.AddExtents(ent.GeometricExtents);
                        }
                    } while (前一个selRes.Value.Count != selRes.Value.Count);
                      
                   return (创建块(selRes),左下框totalExtents);
                }

                (List<Entity>, Extents3d) 左上角()
                {
                    Point3d 左上框1 = new Point3d(totalExtents.MinPoint.X, totalExtents.MaxPoint.Y,0);
                    Point3d 左上框2 = new Point3d(totalExtents.MinPoint.X + 范围长 / 比例值, totalExtents.MaxPoint.Y - 范围宽 / 比例值, 0);
                    PromptSelectionResult selRes = ed.SelectCrossingWindow(左上框1, 左上框2);
                    Extents3d 左上框totalExtents = new Extents3d();
                    if (selRes.Status != PromptStatus.OK) return (new List<Entity>(), new Extents3d());
                    foreach (SelectedObject selObj in selRes.Value)
                    {
                        Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);

                        左上框totalExtents.AddExtents(ent.GeometricExtents);

                    }
                   
                    do
                    {
                        前一个selRes = selRes;
                        左上框2 = new Point3d(左上框totalExtents.MaxPoint.X + 扩张值, 左上框totalExtents.MinPoint.Y - 扩张值, 0);
                        selRes = ed.SelectCrossingWindow(左上框1, 左上框2);
                        左上框totalExtents = new Extents3d();
                        foreach (SelectedObject selObj in selRes.Value)
                        {
                            Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);
                            左上框totalExtents.AddExtents(ent.GeometricExtents);
                        }
                    } while (前一个selRes.Value.Count != selRes.Value.Count);
                    return (创建块(selRes), 左上框totalExtents);
                }
                (List<Entity>, Extents3d) 右上角()
                {
                    Point3d 右上框1 = new Point3d(totalExtents.MaxPoint.X, totalExtents.MaxPoint.Y, 0);
                    Point3d 右上框2 = new Point3d(totalExtents.MaxPoint.X -范围长 / 比例值, totalExtents.MaxPoint.Y - 范围宽 / 比例值, 0);
                    PromptSelectionResult selRes = ed.SelectCrossingWindow(右上框1, 右上框2);
                    Extents3d 右上框totalExtents = new Extents3d();
                    if (selRes.Status != PromptStatus.OK) return (new List<Entity>(), new Extents3d());
                    foreach (SelectedObject selObj in selRes.Value)
                    {
                        Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);

                        右上框totalExtents.AddExtents(ent.GeometricExtents);

                    }
                   
                    do
                    {
                        前一个selRes = selRes;
                        右上框2 = new Point3d(右上框totalExtents.MinPoint.X - 扩张值, 右上框totalExtents.MinPoint.Y - 扩张值, 0);
                        selRes = ed.SelectCrossingWindow(右上框1, 右上框2);
                        右上框totalExtents = new Extents3d();
                        foreach (SelectedObject selObj in selRes.Value)
                        {
                            Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);
                            右上框totalExtents.AddExtents(ent.GeometricExtents);
                        }
                    } while (前一个selRes.Value.Count != selRes.Value.Count);
                    return (创建块(selRes), 右上框totalExtents);
                }
                (List<Entity>, Extents3d) 右下角()
                {
                    Point3d 右下框1 = new Point3d(totalExtents.MaxPoint.X, totalExtents.MinPoint.Y, 0);
                    Point3d 右下框2 = new Point3d(totalExtents.MaxPoint.X - 范围长 / 比例值, totalExtents.MinPoint.Y + 范围宽 / 比例值, 0);
                    PromptSelectionResult selRes = ed.SelectCrossingWindow(右下框1, 右下框2);
                    Extents3d 右下框totalExtents = new Extents3d();
                    if (selRes.Status != PromptStatus.OK) return (new List<Entity>(), new Extents3d());
                    foreach (SelectedObject selObj in selRes.Value)
                    {
                        Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);

                        右下框totalExtents.AddExtents(ent.GeometricExtents);

                    }
                 
                    do
                    {
                        前一个selRes = selRes;
                        右下框2 = new Point3d(右下框totalExtents.MinPoint.X - 扩张值, 右下框totalExtents.MaxPoint.Y + 扩张值, 0);
                        selRes = ed.SelectCrossingWindow(右下框1, 右下框2);
                        右下框totalExtents = new Extents3d();
                        foreach (SelectedObject selObj in selRes.Value)
                        {
                            Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);
                            右下框totalExtents.AddExtents(ent.GeometricExtents);
                        }
                    } while (前一个selRes.Value.Count != selRes.Value.Count);
                 
                    return (创建块(selRes), 右下框totalExtents);
                }
                List<Entity> 创建块(PromptSelectionResult selRes2) {



                    List<Entity> 块 = new List<Entity>();
                    foreach (SelectedObject selObj in selRes2.Value)
                    {

                        Entity ent = (Entity)trans.GetObject(selObj.ObjectId, OpenMode.ForWrite);

                        块.Add(ent);
                        ent.Erase();
                    }
              
                    return 块;
                }
                BlockReference 创建块2(List<List<Entity>> selRes2)
                {

                    int i = 0;
                    BlockTableRecord btrNewBlock = new BlockTableRecord();
                    btrNewBlock.Name = "MyBlock";
                    while (bt.Has(btrNewBlock.Name))
                    {
                        i++;
                        btrNewBlock.Name = "MyBlock" + i;
                    }

                   
                    foreach (var selObjs in selRes2)
                    {
                     
                       
                       

                            foreach (var en in selObjs)
                            {



                            var ent = (Entity)en;
                            
                            var pCopy = (Entity)ent.Clone();
                            btrNewBlock.AppendEntity(pCopy);
                            ent.Erase();


                        }

                        
                    }
                    bt.Add(btrNewBlock);
                   
                    trans.AddNewlyCreatedDBObject(btrNewBlock, true);
                    BlockReference br = new BlockReference(Point3d.Origin, bt[btrNewBlock.Name]);
                
                    space.AppendEntity(br);
                    trans.AddNewlyCreatedDBObject(br, true);
                    return br;
                }
               
                trans.Commit();

            }


        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值