c# cad 二次开发 类库 块的操作
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _14块操作
{
public class Class1
{
//简单块
[CommandMethod(“BlockDemo”)]
public void BlockDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
//using (Transaction trans = db.TransactionManager.StartTransaction())
//{
// BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
OpenMode.ForRead);
// foreach (var item in bt)
// {
// BlockTableRecord btr = (BlockTableRecord)item.GetObject(OpenMode.ForRead);
// }
//}
MyBlockTableRecord.Block1Id =
db.AddBlockTableRecord(MyBlockTableRecord.Block1Name,
MyBlockTableRecord.Block1Ents);
} [CommandMethod("InsertBlockDemo")] public void InsertBlockDemo() { Database
db = HostApplicationServices.WorkingDatabase;
db.InsertBlockBlockReference(MyBlockTableRecord.Block1Id, new Point3d(10, 10,
0)); db.InsertBlockBlockReference(MyBlockTableRecord.Block1Id, new Point3d(40,
10, 0),Math.PI/4,new Scale3d(2));
db.InsertBlockBlockReference(MyBlockTableRecord.Block1Id, new Point3d(100, 10,
0), Math.PI / 4, new Scale3d(2,1.5,1)); } //注释样式的箭头
[CommandMethod("ModifyDimDemo")] public void ModifyDimDemo() { Database db =
HostApplicationServices.WorkingDatabase; MyBlockTableRecord.DimBlock1Id =
db.AddBlockTableRecord(MyBlockTableRecord.DimBlock1Name,
MyBlockTableRecord.DimBlock1Ents); using (Transaction trans =
db.TransactionManager.StartTransaction()) { DimStyleTable dst =
(DimStyleTable)trans.GetObject(db.DimStyleTableId, OpenMode.ForRead); if
(dst.Has("Standard")) { DimStyleTableRecord dstr =
(DimStyleTableRecord)dst["Standard"].GetObject(OpenMode.ForRead); if
(MyBlockTableRecord.DimBlock1Id != ObjectId.Null) { dstr.UpgradeOpen();
dstr.Dimblk = MyBlockTableRecord.DimBlock1Id; dstr.Dimasz = 1;
dstr.DowngradeOpen(); db.SetDimstyleData(dstr); } } trans.Commit(); } } //属性快
[CommandMethod("AttrBlockDemo")] public void AttrBlockDemo() { Database db =
HostApplicationServices.WorkingDatabase; MyBlockTableRecord.AttrBlock1Id =
db.AddBlockTableRecord(MyBlockTableRecord.AttrBlock1Name,
MyBlockTableRecord.AttrBlock1Ents); ObjectId brId =
db.InsertAttrBlockReference(MyBlockTableRecord.AttrBlock1Id, new Point3d(10,
10, 0), 0, new Scale3d(1, 1, 1)); Dictionary<string, string> attrNameValues =
new Dictionary<string, string>(); attrNameValues.Add("编号", "天线11");
attrNameValues.Add("功率", "10.0dBm"); attrNameValues.Add("功率222", "10.0dBm");
brId.UpdateBlockAttr(attrNameValues); } [CommandMethod("TestDemo")] public void
TestDemo() { Database db = HostApplicationServices.WorkingDatabase;
MyBlockTableRecord.AttrBlock1Id =
db.AddBlockTableRecord(MyBlockTableRecord.AttrBlock1Name,
MyBlockTableRecord.AttrBlock1Ents); using (Transaction trans =
db.TransactionManager.StartTransaction()) { BlockTable bt =
(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); //DimStyleTable
dst = (DimStyleTable)trans.GetObject(db.DimStyleTableId, OpenMode.ForRead);
//if (dst.Has("Standard")) //{ // DimStyleTableRecord dstr =
(DimStyleTableRecord)dst["Standard"].GetObject(OpenMode.ForRead); //} foreach
(var item in bt) { if (bt.Has(MyBlockTableRecord.AttrBlock1Id)) { if (item ==
MyBlockTableRecord.AttrBlock1Id) { BlockTableRecord btr =
(BlockTableRecord)item.GetObject(OpenMode.ForRead); foreach (var item1 in btr)
{ if (item1.GetObject(OpenMode.ForRead) is AttributeDefinition) {
AttributeDefinition attr =
(AttributeDefinition)item1.GetObject(OpenMode.ForRead); } } } } } } }
[CommandMethod("PickDemo")] public void PickDemo() { Database db =
HostApplicationServices.WorkingDatabase; Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor; PromptEntityResult per =
ed.GetEntity("选择块"); if (per.Status == PromptStatus.OK) { using (Transaction
trans = db.TransactionManager.StartTransaction()) { BlockReference br =
(BlockReference)per.ObjectId.GetObject(OpenMode.ForRead); } } }
}
}
BlockTool.cs
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _14块操作
{
public static class BlockTool
{
///
/// 添加块表记录到图形数据库
///
/// 图形数据库
/// 块表记录名
/// 图形对象
/// ObjectId
public static ObjectId AddBlockTableRecord(this Database db, string btrName,
List ents)
{
ObjectId btrId = ObjectId.Null;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
OpenMode.ForRead);
if (!bt.Has(btrName))
{
BlockTableRecord btr = new BlockTableRecord();
btr.Name = btrName;
for (int i = 0; i < ents.Count; i++)
{
btr.AppendEntity(ents[i]);
}
bt.UpgradeOpen();
bt.Add(btr);
trans.AddNewlyCreatedDBObject(btr, true);
bt.DowngradeOpen();
}
btrId = bt[btrName];
trans.Commit();
}
return btrId;
}
///
/// 向模型空间插入块参照
///
/// 图形数据库
/// 块的ObjectId
/// 插入位置
/// ObjectId
public static ObjectId InsertBlockBlockReference(this Database db, ObjectId
blockRecordId, Point3d position)
{
ObjectId blkReferId = ObjectId.Null;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
OpenMode.ForRead);
if (bt.Has(blockRecordId))
{
//声明块参照
BlockReference br = new BlockReference(position, blockRecordId);
BlockTableRecord btr =
(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite);
blkReferId = btr.AppendEntity(br);
trans.AddNewlyCreatedDBObject(br, true);
}
trans.Commit();
}
return blkReferId; } /// <summary> /// 向模型空间插入块参照 /// </summary> /// <param
name="db">图形数据库</param> /// <param name="blockRecordId">块的ObjectId</param> ///
<param name="position">插入位置</param> /// <param name="rotation">旋转角度</param> ///
<param name="scale">缩放比例</param> /// <returns>ObjectId</returns> public static
ObjectId InsertBlockBlockReference(this Database db, ObjectId blockRecordId,
Point3d position,double rotation,Scale3d scale) { ObjectId blkReferId =
ObjectId.Null; using (Transaction trans =
db.TransactionManager.StartTransaction()) { BlockTable bt =
(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); if
(bt.Has(blockRecordId)) { BlockReference br = new BlockReference(position,
blockRecordId); br.Rotation = rotation; br.ScaleFactors = scale;
BlockTableRecord btr =
(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite); blkReferId = btr.AppendEntity(br);
trans.AddNewlyCreatedDBObject(br, true); } trans.Commit(); } return blkReferId;
} /// <summary> /// 向模型空间插入属性块参照 /// </summary> /// <param
name="db">图形数据库</param> /// <param name="blockRecordId">块的ObjectId</param> ///
<param name="position">插入位置</param> /// <param name="rotation">旋转角度</param> ///
<param name="scale">缩放比例</param> /// <returns>ObjectId</returns> public static
ObjectId InsertAttrBlockReference(this Database db, ObjectId blockRecordId,
Point3d position, double rotation, Scale3d scale) { ObjectId blkReferId =
ObjectId.Null; using (Transaction trans =
db.TransactionManager.StartTransaction()) { BlockTable bt =
(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); if
(bt.Has(blockRecordId)) { //声明块参照 BlockReference br = new
BlockReference(position, blockRecordId); br.Rotation = rotation;
br.ScaleFactors = scale; BlockTableRecord btr =
(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite); blkReferId = btr.AppendEntity(br); //添加属性定义
BlockTableRecord blockRecord =
(BlockTableRecord)blockRecordId.GetObject(OpenMode.ForRead); if
(blockRecord.HasAttributeDefinitions) { foreach (ObjectId item in blockRecord)
{ DBObject obj = item.GetObject(OpenMode.ForRead); if (obj is
AttributeDefinition) { //声明属性参照 AttributeReference attrRef = new
AttributeReference(); attrRef.SetAttributeFromBlock((AttributeDefinition)obj,
br.BlockTransform); br.AttributeCollection.AppendAttribute(attrRef);
trans.AddNewlyCreatedDBObject(attrRef, true); } } }
trans.AddNewlyCreatedDBObject(br, true); } trans.Commit(); } return blkReferId;
} /// <summary> /// 更新块参照的属性 /// </summary> /// <param
name="BlockRefId">块参照的ObjectId</param> /// <param
name="attrNameValues">属性字典</param> public static void UpdateBlockAttr(this
ObjectId BlockRefId, Dictionary<string, string> attrNameValues) { using
(Transaction trans = BlockRefId.Database.TransactionManager.StartTransaction())
{ if (BlockRefId != ObjectId.Null) { BlockReference br =
(BlockReference)BlockRefId.GetObject(OpenMode.ForRead); foreach (ObjectId item
in br.AttributeCollection) { AttributeReference attRef =
(AttributeReference)item.GetObject(OpenMode.ForRead); //判断属性字典中是否包含要更改的属性值 if
(attrNameValues.ContainsKey(attRef.Tag.ToString())) { attRef.UpgradeOpen();
attRef.TextString = attrNameValues[attRef.Tag.ToString()].ToString();
attRef.DowngradeOpen(); } } } trans.Commit(); } } }
}