明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2469|回复: 8

如何把一个层上的所有自定义的块复制到另一层上去?

[复制链接]
发表于 2010-8-4 13:25:00 | 显示全部楼层 |阅读模式

请版主帮忙!下面的方式执行完后,在新层上创建时实体都不可见,用CTRL+A可以选择到自定义的实体,但属性显示在多个层上。求助

List<BlockReference> newBrs = new List<BlockReference>();

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;

                foreach (ObjectId id in btr)
                {
                    Entity ent = trans.GetObject(id, OpenMode.ForRead, false) as Entity;
                    if (ent.GetType() == typeof(BlockReference))
                    {
                        BlockReference oldBr = ent as BlockReference;
                        if (oldBr.Name == "MyBlock1" || oldBr.Name == "MyBlock2" )
                        {
                            //BlockReference newBr = new BlockReference(oldBr.Position, oldBr.BlockTableRecord);
                            BlockReference newBr = oldBr.Clone()as BlockReference;
                            newBr.Layer = assignedLayerName;
                            newBr.Visible = true;
                            newBrs.Add(newBr);
                        }
                    }
                }
                trans.Commit();
            }
            //在新层添加所有实体
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //选择所有道路节点实体
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                for (int i = 0; i < newBrs.Count; i++)
                {
                    btr.AppendEntity(newBrs);
                    trans.AddNewlyCreatedDBObject(newBrs, true);
                }
                trans.Commit();
            }
        }

发表于 2010-8-4 15:21:00 | 显示全部楼层
  1.         [CommandMethod("tt4")]
  2.         public void test24()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             Database db = doc.Database;
  7.             PromptSelectionResult res =
  8.                 ed.SelectAll(
  9.                     new SelectionFilter(
  10.                         new TypedValue[]
  11.                         {
  12.                             new TypedValue(0, "insert"),
  13.                             new TypedValue(2, "MyBlock1,MyBlock2")
  14.                         }));
  15.             if (res.Status == PromptStatus.OK)
  16.             {
  17.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  18.                 {
  19.                     ObjectIdCollection ids = new ObjectIdCollection(res.Value.GetObjectIds());
  20.                     IdMapping idm = new IdMapping();
  21.                     db.DeepCloneObjects(ids, db.CurrentSpaceId, idm, false);
  22.                     foreach (IdPair idp in idm)
  23.                     {
  24.                         BlockReference blkref = tr.GetObject(idp.Value, OpenMode.ForWrite) as BlockReference;
  25.                         if (blkref != null)
  26.                         {
  27.                             blkref.Layer = "0";
  28.                         }
  29.                     }
  30.                     tr.Commit();
  31.                 }
  32.             }
  33.         }
 楼主| 发表于 2010-8-5 11:03:00 | 显示全部楼层

版主:块是复制过去了,在两个层上都有,但是若关掉原始块所在的层,打开新层,则复制到新层的块不可见,也无法用鼠标选取,通过快速选择可以找到复制后的块。和原始的块定义有关吗?深度克隆后,克隆体(块)包含的成员与原来的块绑定在一起吗?望版主进一步指教。谢ing!

发表于 2010-8-5 11:07:00 | 显示全部楼层

你的块定义时,块内实体的图层是怎么定义的?

 楼主| 发表于 2010-8-5 12:44:00 | 显示全部楼层
本帖最后由 作者 于 2010-8-5 13:13:52 编辑

“第一版”:块内实体.Layer=自定义层1。(实验后不行)。

“第二版”:现在0层上建块myblock1,然后删掉myblock1,再新建图层1,建块myblock1,然后运行程序,复制块myblock1到图层2,此时能够可见。但若直接新建图层1,建块myblock1,然后运行程序,复制块myblock1到图层2,此时则不可见。

呵呵,晕了!怎么能直接就看见哪?

发表于 2010-8-5 13:35:00 | 显示全部楼层

试下设置实体layer=byblock

 楼主| 发表于 2010-8-6 09:29:00 | 显示全部楼层
怎么指定哪?版主能给出个具体语法格式。
 楼主| 发表于 2010-8-20 17:40:00 | 显示全部楼层
解决方案:创建块时,将块的层设置为“0”层,可解决此问题。
发表于 2010-10-31 18:10:00 | 显示全部楼层
先学习了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 00:29 , Processed in 0.210405 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表