CAD二次开发(13)- 块参照的颜色修改+块参照的删除操作

1. 块参照颜色的修改

块颜色的修改比较麻烦,因为:

  1. 块可能包含多种不同类型的图形实体,如直线、圆、文本、多段线等,每种实体都有自己的颜色属性。此外,块还可以嵌套,即块内还包含其他块,这增加了处理的复杂性。
  2. 块中的图形实体颜色可以继承自层(Layer)的颜色,也可以单独指定。这意味着在渲染时,需要考虑当前实体是否覆盖了层的颜色设置。此外,块在插入时还可以指定颜色,这又提供了一层额外的覆盖机制。

从我总结下来有两种方式:

方式1:炸开块,然后对实体类进行颜色设置

具体如下:

                    DBObjectCollection entitySet = new DBObjectCollection();
                    foreach (var item in references)
                    {
                        //炸开每个块,得到炸开块的实体对象
                        item.Explode(entitySet);
                    }
                    for (int j = 0; j < entitySet.Count; j++)
                    {
                        //再对实体对象进行颜色设置(因为块不支持直接颜色处理),颜色从绿色开始
                        Entity entity = (Entity)entitySet[j];
                        entity.Color = Color.FromColorIndex(ColorMethod.ByAci, (short)(2 + i));
                        entity.Layer = layer;
                        db.AddEnityToModelSpace(entity);
                    }

里面的references就是块集合 List<BlockReference>,把每个块炸成实体集合,对每个实体进行颜色设置,最后重新添加到模型空间中,AddEnityToModelSpace参照我前面文章的代码工具类。

但是这样的缺点非常明显,就是改变了我CAD图示最本质的东西,将一个整体的BlockReference变成了一个个零散的实体类,所以不推荐。

方式2:通过byBlock方式来修改颜色

步骤1:
先利用如下方式修改块颜色:

 /// <summary>
        /// 块颜色修改
        /// </summary>
        /// <param name="db"></param>
        /// <param name="strBlockName">块名称</param>
        /// <param name="blockReferences">要修改的块列表</param>
        /// <param name="color">要修改成的颜色</param>
        internal static void UpdateBlockRefColor(Database db, string strBlockName, List<BlockReference> blockReferences,short color,List<BlockReference> deleteList)
        {
            List<Point3d> point3ds = blockReferences.Select(p => p.Position).ToList();
            List<Point3d> deletePoint3ds = deleteList.Select(p => p.Position).ToList();           
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                foreach (ObjectId objId in btr)
                {
                    DBObject dbObj = tr.GetObject(objId, OpenMode.ForWrite);
                    if (dbObj is BlockReference)
                    {
                        BlockReference refEnt = dbObj as BlockReference;
                        BlockTableRecord mtbtr = (BlockTableRecord)tr.GetObject(refEnt.BlockTableRecord, OpenMode.ForWrite);
                        if (point3ds.Contains(refEnt.Position))
                        {
                            if (mtbtr.Name.Equals(strBlockName))
                            {
                                refEnt.Color = Color.FromColorIndex(ColorMethod.ByBlock, color);
                            }
                        }
                        //删除指定的块
                        if (deletePoint3ds.Contains(refEnt.Position))
                        {
                            if (mtbtr.Name.Equals(strBlockName))
                            {
                                refEnt.Erase();
                            }
                        }
                    }
                    
                }
                tr.Commit();
            }
        }

你们不需要关注我删除指定块的逻辑,需要关注的是Color.FromColorIndex(ColorMethod.ByBlock, color);

这块的逻辑是:
对所有的块表记录进行判断,如果是BlockReference且名称符合且在你需要修改的块参照集合中,则再进行修改颜色操作。
有人会问,你这样操作不是很麻烦吗?为什么不在上一步直接循环修改每个块颜色呢,不好意思,这种方式不行,你们可以试试。

但是按照步骤1,你就会发现,自己CAD画布上的块并没有发生颜色的变化,所以我们还需要在CAD上做一些设置即可。
在这里插入图片描述

步骤2:
选中其中的某个块参照,选择块编辑器并打开。
在这里插入图片描述

在这里插入图片描述

步骤3:
点击块参照线条并选中,右击并选择特性:
在这里插入图片描述

在这里插入图片描述
将其改成ByBlock,并选择关闭并保存。
在这里插入图片描述
这样我们要的效果就出来了,如下:
在这里插入图片描述

2. 块删除

块删除分为块引用删除和块定义删除。

块参照的删除我其实上面已经列举了 ,你们也看到了。

或者如下:

/// <summary>
        /// 根据块名删除块引用
        /// </summary>
        /// <param name="db">数据库</param>
        /// <param name="strBlockName">块名称</param>
        /// <param name="point3ds">需要删除的块参照的基点坐标</param>
        internal static void DeleteBlockRefByBlockName(Database db, string strBlockName,List<Point3d> point3ds)
        {
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                foreach (ObjectId objId in btr)
                {
                    DBObject dbObj = tr.GetObject(objId, OpenMode.ForWrite);
                    if (dbObj is BlockReference)
                    {
                        BlockReference refEnt = dbObj as BlockReference ;
                        if (point3ds.Contains(refEnt.Position))
                        {
                            BlockTableRecord mtbtr = (BlockTableRecord)tr.GetObject(refEnt.BlockTableRecord , OpenMode.ForWrite);
                            if (mtbtr.Name.Equals(strBlockName))
                            {
                                refEnt.Erase();
                            } 
                        }
                    }

                }
                tr.Commit();
            }
        }
        
  /// <summary>
        /// 根据块名删除块定义
        /// </summary>
        /// <param name="db">数据库</param>
        /// <param name="strBlockName">块名称</param>
        internal static void DeleteBlockByBlockName(Database db,string strBlockName)
        {
            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                foreach (ObjectId objId in bt)
                {
                    BlockTableRecord bbtr = tr.GetObject(objId, OpenMode.ForWrite) as BlockTableRecord;
                    if (bbtr.Name.Equals(strBlockName))
                    {
                        bbtr.Erase();
                    }
                }
                tr.Commit();
            }
        }
        
        /// <summary>
        /// 强行删除图形及图形上的块参照
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="layerName">图层名</param>
        /// <param name="delete"></param>
        /// <returns></returns>
        public static bool DeleteLayerALLBre(this Database db, string layerName, bool delete)
        {
            if (layerName == "0" || layerName == "Defpoints") return false;
            bool isDeleteOK = false;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
                lt.GenerateUsageData();
                if (lt.Has(layerName))
                {
                    LayerTableRecord ltr = (LayerTableRecord)lt[layerName].GetObject(OpenMode.ForWrite);
                    if (delete)
                    {
                        if (ltr.IsUsed)
                        {
                            deleteAllEntityInLayerBre(ltr);
                        }
                    }
                }
                else
                {
                    isDeleteOK = true;
                }
                trans.Commit();
            }
            return isDeleteOK;
        }

		
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术闲聊DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值