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();}}
}
}