这篇文章意在讲解清楚块定义的创建和使用,希望可以帮助到你~~~
需求
- 实现用户选择已经存在的矩形闭合轮廓线,指定快定义原点。
- 生成一个名为“大熊“的快定义,把选择的轮廓线放到块定义中。
- 并在闭合轮廓内添加一个实体填充图案。
- 不删除原本选择的线。
块定义(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();
}
}
操作截图
- 原始图框
2. 选择实体
3. 选择块原点
- 块定义这里查看,块定义已经创建成功
- 插入块应用后,查看原点位置和填充图案
结尾
简单的展示了整个流程,并没有封装成方法来使用,可以自行封装使用。主要是讲解块定义的创建和添加实体注意事项,填充图案创建的注意事项。希望对你有帮助。