CAD 二次开发 块定义解析和使用

这篇文章意在讲解清楚块定义的创建和使用,希望可以帮助到你~~~

需求

  1. 实现用户选择已经存在的矩形闭合轮廓线,指定快定义原点。
  2. 生成一个名为“大熊“的快定义,把选择的轮廓线放到块定义中。
  3. 并在闭合轮廓内添加一个实体填充图案。
  4. 不删除原本选择的线。

块定义(BlockTableRecord)

CAD 中手动创建的界面如下,可以看到需要定义块名字、块的原点位置和块的内容
请添加图片描述

通过代码表示:(注:完整代码在文章后贴上)

BlockTable blockTable = transaction.GetObject(database.BlockTableId, OpenMode.ForWrite) as BlockTable;
// 创建块表记录
BlockTableRecord blockTableRecord = new BlockTableRecord();
// 检查块定义是否已存在,示例默认不存在了
if (blockTable.Has(blockName))
{
    //blockTableRecord = blockTable[blockName].GetObject(OpenMode.ForWrite) as BlockTableRecord;
}
blockTableRecord.Name = blockName;
// 将实体对象添加到块表记录中
foreach (Entity entity in entities)
{
    Entity copyEntity = entity.GetTransformedCopy(Matrix3d.Identity);
    blockTableRecord.AppendEntity(copyEntity);
}
blockTableRecord.Origin = basePoint;

// 将块表记录添加到块表中
ObjectId nwID = blockTable.Add(blockTableRecord);
transaction.AddNewlyCreatedDBObject(blockTableRecord, true);
blockTableRecord = transaction.GetObject(nwID, OpenMode.ForWrite) as BlockTableRecord;
// 提交事务
transaction.Commit();
  • 所有的块定义都存在 BlockTable 对象中,需要使用 BlockTable 对象来判断块定义是否已经存在和添加块定义等操作。
  • blockTableRecord 的 Origin 属性,是块定义的原点。类似手动创建时需要指定原点时候的操作。
  • entities 是需要添加进块定义的所有实体集合。需要注意的点,我们是选择已有的实体来生成块定义的,因此,在 CAD 的数据库中已经存在,我们添加到块定义时,需要把实体复制一边再添加到块定义中。

块定义中插入实体填充图案(Hatch)

  • 插入填充图案需要找到填充图案的外轮廓。
  • 如果填充图案中有多个轮廓时,需要分开去添加,不能全部放到一个 ObjectIdCollection 中添加。
  • 如果轮廓是包含状态时,需要先添加最外轮廓,再添加内轮廓。
//这里偷懒了,因为只添加了一个闭合轮廓线,就直接使用第一个实体了,正常情况下需要做一定的判断去选择的。
 Entity plEntity = blockTableRecord.Cast<ObjectId>().Select(id => transaction.GetObject(id, OpenMode.ForWrite)).OfType<Entity>().FirstOrDefault();
 ObjectIdCollection obIds = new ObjectIdCollection() { plEntity.Id };
 Hatch hatch = new Hatch();
 hatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
 hatch.PatternScale = 1;
 blockTableRecord.AppendEntity(hatch);
 transaction.AddNewlyCreatedDBObject(hatch, true);
 hatch.Associative = true;   // 设置关联  
 hatch.AppendLoop(HatchLoopTypes.Outermost, obIds);
 hatch.EvaluateHatch(true);

完整代码

[CommandMethod("run")]
public void Run2()
{
    Document doc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
    Database database = doc.Database;
    //块定义名字
    string blockName = "大熊";
    //快定义原点
    Point3d basePoint = new Point3d();
    //快定义添加的实体
    List<Entity> entities = new List<Entity>();

    Editor ed = doc.Editor;

    #region 选择快定义实体
    PromptSelectionOptions opt = new PromptSelectionOptions();
    opt.MessageForAdding = "请选择需要添加进块定义实体";
    opt.SingleOnly = false;
    PromptSelectionResult selectedRoomResult = ed.GetSelection(opt);
    if (selectedRoomResult.Status != PromptStatus.OK) return;
    #endregion

    #region 选择块原点
    PromptPointOptions pointOpt = new PromptPointOptions("选择块原点");
    PromptPointResult pointResult = ed.GetPoint(pointOpt);
    if (pointResult.Status != PromptStatus.OK) return;
    basePoint = pointResult.Value;
    #endregion

    using (Transaction transaction = database.TransactionManager.StartTransaction())
    {
        //拿到选择的实体
        entities = selectedRoomResult.Value
        .Cast<SelectedObject>()
        .Select(x => transaction.GetObject(x.ObjectId, OpenMode.ForRead) as Entity)
        .ToList();

        BlockTable blockTable = transaction.GetObject(database.BlockTableId, OpenMode.ForWrite) as BlockTable;
        // 创建块表记录
        BlockTableRecord blockTableRecord = new BlockTableRecord();
        // 检查块定义是否已存在,示例默认不存在了
        if (blockTable.Has(blockName))
        {
            //blockTableRecord = blockTable[blockName].GetObject(OpenMode.ForWrite) as BlockTableRecord;
        }
        blockTableRecord.Name = blockName;
        // 将实体对象添加到块表记录中
        foreach (Entity entity in entities)
        {
            Entity copyEntity = entity.GetTransformedCopy(Matrix3d.Identity);
            blockTableRecord.AppendEntity(copyEntity);
        }
        blockTableRecord.Origin = basePoint;

        // 将块表记录添加到块表中
        ObjectId nwID = blockTable.Add(blockTableRecord);
        transaction.AddNewlyCreatedDBObject(blockTableRecord, true);
        blockTableRecord = transaction.GetObject(nwID, OpenMode.ForWrite) as BlockTableRecord;

        #region 添加填充
        //这里偷懒了,因为只添加了一个闭合轮廓线,就直接使用第一个实体了,正常情况下需要做一定的判断去选择的。
        Entity plEntity = blockTableRecord.Cast<ObjectId>().Select(id => transaction.GetObject(id, OpenMode.ForWrite)).OfType<Entity>().FirstOrDefault();
        ObjectIdCollection obIds = new ObjectIdCollection() { plEntity.Id };
        Hatch hatch = new Hatch();
        hatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
        hatch.PatternScale = 1;
        blockTableRecord.AppendEntity(hatch);
        transaction.AddNewlyCreatedDBObject(hatch, true);
        hatch.Associative = true;   // 设置关联  
        hatch.AppendLoop(HatchLoopTypes.Outermost, obIds);
        hatch.EvaluateHatch(true); 
        #endregion

        // 提交事务
        transaction.Commit();
    }
}

操作截图

  1. 原始图框

请添加图片描述
2. 选择实体
请添加图片描述
3. 选择块原点
请添加图片描述

  1. 块定义这里查看,块定义已经创建成功
    请添加图片描述
  2. 插入块应用后,查看原点位置和填充图案
    请添加图片描述

结尾

简单的展示了整个流程,并没有封装成方法来使用,可以自行封装使用。主要是讲解块定义的创建和添加实体注意事项,填充图案创建的注意事项。希望对你有帮助。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

baobao熊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值