using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading;
using Bricscad.ApplicationServices;
using Bricscad.EditorInput;
using SWS.Commons;
using Teigha.DatabaseServices;
using Teigha.Geometry;
using Database = Teigha.DatabaseServices.Database;
using Entity = Teigha.DatabaseServices.Entity;
using Path = System.IO.Path;
using Color = Teigha.Colors.Color;
using System.Security.Cryptography;
using System.Threading.Tasks;
using SWS.Model;
namespace SWS.CAD.Base
{
public static class General
{
static Document doc = null;
static Bricscad.EditorInput.Editor ed = null;
static Database db = null;
///
/// 新建一个dwg
///
/// 文件夹路径
/// 文件名,不需要后缀
public static bool CreateDwg(string folderPath, string Name)
{
// 创建一个新的数据库对象,该对象代表一个 DWG 文件
Database newDb = new Database(true, true);
string fullPath = Path.Combine(folderPath, Name + ".dwg");
// 确保目标文件夹存在
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
try
{
// 保存数据库到指定路径
newDb.SaveAs(fullPath, DwgVersion.Current);
// 关闭数据库
newDb.Dispose();
//EditorHelper.WriteInfo("新的 DWG 文件已成功创建:" + fullPath);
return true;
}
catch (Exception)
{
return false;
}
}
///
/// 新建图纸
///
///
public static bool NewDwgInApp(string newName)
{
Application.DocumentManager.Add(newName);//新建图纸
return true;
}
public static void InsertTest(string Test)
{
//插入文字
DBText dBText = new DBText();
dBText.TextString = Test;
dBText.Height = 100;
dBText.Normal = Vector3d.XAxis;
dBText.HorizontalMode = TextHorizontalMode.TextMid;
dBText.VerticalMode = TextVerticalMode.TextVerticalMid;
dBText.AlignmentPoint = Point3d.Origin;
var dBId = dBText.ToModelSpace();
}
///
/// 添加实体到模型空间
///
/// 要添加的实体
/// 实体ObjectId
public static ObjectId ToModelSpace(this Entity entity, Database db = null)
{
//if (entity.Id != ObjectId.Null|| entity.Id.ToInt() != 0)
//{
// return entity.Id;
//}
if (db == null)
{
db = HostApplicationServices.WorkingDatabase;
}
ObjectId id;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord modelSpace = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
id = modelSpace.AppendEntity(entity);
trans.AddNewlyCreatedDBObject(entity, true);
trans.Commit();
trans.Dispose();
}
return id;
}
///
/// 读取图块图纸插入当前文档
///
/// 块图纸路径
/// 块名
/// 坐标位
public static ObjectId InsertBlock(string fileName, string blockName, Point3d position)
{
ObjectId entity = ObjectId.Null;
if (!File.Exists(fileName)) return entity;
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
// 新建块文件数据库对象 读取块
using (Database blockDb = new Database(false, true))
{
// 读取外部块 dwg
blockDb.ReadDwgFile(fileName, System.IO.FileShare.ReadWrite, true, null);
// 关闭文件
blockDb.CloseInput(true);
// 先锁定文档 多文档的情况需要先锁定
using (DocumentLock lockDoc = doc.LockDocument())
{
// 新建图层id
ObjectId layId = ObjectId.Null;
// 开启事务处理
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
ObjectId idBtr = doc.Database.Insert(blockName, blockName, blockDb, true);
BlockTableRecord curBtr = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
var block = new BlockReference(Point3d.Origin, idBtr);
block.Position = position;
curBtr.AppendEntity(block);
trans.AddNewlyCreatedDBObject(block, true);
entity = block.Id;
trans.Commit();
trans.Dispose();
}
}
}
return entity;
}
///
/// 从旧图纸复制
///
///
///
///
///
public static IdMapping CopyFormOldDoc(this Document oldODc, params ObjectId[] oldIds)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
IdMapping idMap = new IdMapping();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
using (Database srcDb = oldODc.Database)
{
ObjectIdCollection oids = new ObjectIdCollection(oldIds);
if (oids.Count > 0)
{
srcDb.WblockCloneObjects(oids, db.CurrentSpaceId, idMap, DuplicateRecordCloning.Ignore, false);
}
}
tr.Commit();
}
return idMap;
}
///
/// 获得实体
///
///
///
///
///
public static T GetEntity(this ObjectId id, OpenMode openMode = OpenMode.ForWrite) where T : Entity
{
if (id == ObjectId.Null)
{
return null;
}
var db = HostApplicationServices.WorkingDatabase;
T obj;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
obj = trans.GetObject(id, openMode) as T;
return obj;
}
}
///
/// 打开一个dwg图纸文件
///
/// 文件路径
/// 是否只读模式,true为只读
public static string OpenDwg(string filePath, bool isReadOnly = false)
{
try
{
Application.DocumentManager.Open(filePath, isReadOnly);
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
if (isReadOnly)
{
ed.WriteMessage("\n 以只读模式打开图纸。\n");
}
else
{
ed.WriteMessage("\n 已打开图纸,可继续编辑。\n");
}
return "";
}
catch (Exception ex)
{
string errorMsg = $"图纸:{filePath},打开失败,信息:{ex.Message}";
LoggerHelper.Current.Error(errorMsg);
return errorMsg;
}
}
#region 获取缩略图
///
/// 获取缩略图
///
///
///
public static Bitmap GetDwgThumbnail(string dwgPath)
{
try
{
Database dbb = new Database(false, true);
dbb.ReadDwgFile(dwgPath, FileShare.Read, false, "");
System.Drawing.Bitmap preview = dbb.ThumbnailBitmap;
if (preview != null)
{
preview.MakeTransparent(System.Drawing.Color.White);
return preview;
}
else { return null; }
}
catch (Exception ex)
{
return null;
}
}
#endregion
#region 根据句柄获取图元
///
/// 根据句柄获取图元
///
///
///
public static ObjectId GetObjectIdByHandle(string handleId)
{
try
{
var id = long.Parse(handleId, System.Globalization.NumberStyles.HexNumber);
Handle handle = new Handle(id);
ObjectId objeId = HostApplicationServices.WorkingDatabase.GetObjectId(false, (Handle)handle, 0);
return objeId;
}
catch (Exception ex)
{
string errorMsg = $"根据句柄获取图元GetObjectIdByHandle失败,信息:{ex.Message}";
LoggerHelper.Current.Error(errorMsg);
return ObjectId.Null;
}
}
#endregion
#region 根据句柄选中图元并放大
///
/// 根据句柄选中图元
///
/// objectId
public static string SelectEntityByHandle(string handleId)
{
try
{
var objId = GetObjectIdByHandle(handleId);
if (objId == null)
{
return $"没找到【{handleId}】的图元!";
}
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 验证对象是否为图元
Entity ent = tr.GetObject(objId, OpenMode.ForRead) as Entity;
if (ent != null)
{
// 创建包含该ObjectId的数组
ObjectId[] objIds = { objId };
// 清空当前选择集并添加新的ObjectId
// 更新编辑器以显示选中效果
ed.SetImpliedSelection(objIds);
ed.WriteMessage($"\n成功选中句柄为 {handleId} 的图元。\n");
//方法一 操作中间视图
ZoomToSelected();
//方法二 控制台命令:zoom ob
//SendCommand("ZOOM\nob\n"); //ZOOM回车ob回车
}
else
{
ed.WriteMessage("\n该句柄对应的对象不是图元。\n");
}
tr.Commit();
return string.Empty;
}
}
catch (Exception ex)
{
string errorMsg = $"根据句柄选中图元SelectEntityByHandle失败,信息:{ex.Message}";
LoggerHelper.Current.Error(errorMsg);
return ex.Message;
}
}
#endregion
#region 选中图元
///
/// 选中图元
///
/// objectId
public static void SelectEntity(ObjectId objId)
{
try
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 验证对象是否为图元
Entity ent = tr.GetObject(objId, OpenMode.ForRead) as Entity;
if (ent != null)
{
// 创建包含该ObjectId的数组
ObjectId[] objIds = { objId };
// 清空当前选择集并添加新的ObjectId
// 更新编辑器以显示选中效果
ed.SetImpliedSelection(objIds);
//ed.WriteMessage("\n成功选中图元。" );
}
else
{
ed.WriteMessage("\n该句柄对应的对象不是图元。");
}
tr.Commit();
}
}
catch (Exception ex)
{
throw;
}
}
#endregion
#region 图纸选中放大到视图中间
///
/// 图纸选中放大到视图中间
///
/// 文件路径
/// 是否只读模式,true为只读
public static void ZoomToSelected()
{
try
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
Database db = doc.Database;
// 1. 获取当前选中对象
PromptSelectionResult selRes = ed.SelectImplied();
if (selRes.Status != PromptStatus.OK)
{
ed.WriteMessage("\n未选中任何图元。\n");
return;
}
SelectionSet selection = selRes.Value;
if (selection.Count == 0)
{
ed.WriteMessage("\n选择集为空。\n");
return;
}
// 2. 计算所有选中图元的合并范围
Extents3d totalExtents = new Extents3d();
bool isFirst = true;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (SelectedObject selObj in selection)
{
if (selObj == null) continue;
Entity ent = tr.GetObject(selObj.ObjectId, OpenMode.ForRead) as Entity;
if (ent == null) continue;
// 获取图元几何范围(自动跳过无范围对象)
try
{
Extents3d entExtents = ent.GeometricExtents;
if (isFirst)
{
totalExtents = entExtents;
isFirst = false;
}
else
{
totalExtents.AddExtents(entExtents);
}
}
catch { /* 忽略无法获取范围的对象 */ }
}
tr.Commit();
}
if (isFirst) // 表示没有有效范围
{
ed.WriteMessage("\n选中的图元没有可计算的几何范围。\n");
return;
}
// 3. 创建视图变换矩阵
using (ViewTableRecord view = ed.GetCurrentView())
{
// 计算范围中心点
Point2d center = new Point2d(
(totalExtents.MinPoint.X + totalExtents.MaxPoint.X) / 2,
(totalExtents.MinPoint.Y + totalExtents.MaxPoint.Y) / 2
);
// 计算范围尺寸
double width = totalExtents.MaxPoint.X - totalExtents.MinPoint.X;
double height = totalExtents.MaxPoint.Y - totalExtents.MinPoint.Y;
double margin = Math.Max(width, height) * 0.1; // 增加10%边距
// 设置视图参数
view.CenterPoint = center;
view.Width = width + margin;
view.Height = height + margin;
// 应用视图变换
ed.SetCurrentView(view);
ed.UpdateScreen();
}
ed.WriteMessage("\n已缩放到选中图元范围。\n");
}
catch (Exception ex)
{
}
}
#endregion
#region 向控制台发送命令
public static void SendCommand(string command)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
using (Transaction tr = doc.TransactionManager.StartTransaction())
{
// 操作数据库...
doc.SendStringToExecute($"\n{command}\n", true, false, false);
tr.Commit(); // 必须提交
}
Thread.Sleep(500);
}
#endregion
#region 向控制台发送信息
///
/// 向控制台发送信息
///
///
public static void SendMessage(string msg)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage($"\n {msg} \n");
}
#endregion
#region 获取当前图纸名
///
/// 获取当前图纸名
///
public static string GetDwgName()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
return doc == null ? "" : doc.Name;
}
#endregion
#region 读取图元,插入图纸
///
/// 读取图元,插入图纸
///
/// 图元文件路径
/// 传入的位号
/// 返回添加的位号
public static ObjectId InsertExternalDWG(string filePath, string tag, ref string tagNumber)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
ObjectId oid = ObjectId.Null;
if (!File.Exists(filePath))
{
ed.WriteMessage("\n 错误:图元文件不存在!\n");
return oid;
}
// 获取当前数据库
Database destDb = HostApplicationServices.WorkingDatabase;
using (Transaction tr = destDb.TransactionManager.StartTransaction())
{
try
{
// 创建临时数据库读取外部DWG
using (Database sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(filePath, FileOpenMode.OpenForReadAndAllShare, false, null);
// 生成唯一块名(避免重名)
string blockName = tagNumber = GetUniqueBlockName(destDb, tag);
// 将外部DWG转换为块定义
ObjectId blockId = destDb.Insert(blockName, sourceDb, true);
// 创建块参照
BlockReference br = new BlockReference(
Point3d.Origin, // 插入点(可修改)
blockId// bt[blockName]
);
// 设置比例和旋转
br.ScaleFactors = new Scale3d(1.0); // 比例因子
br.Rotation = 0.0; // 旋转角度(弧度)
// 获取实时鼠标位置
BlockDragJig jig = new BlockDragJig(br, ed);
PromptResult dragResult = ed.Drag(jig);
// 添加到当前模型空间
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(destDb),
OpenMode.ForWrite
);
// 处理插入结果
if (dragResult.Status == PromptStatus.OK)
{
btr.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
//AddValueToAcdbDictionary(tr, br, "1410523e-d594-4527-9f04-130bb89c1cf0", "");
tr.Commit();
oid = br.Id;
ed.WriteMessage($"\n 成功插入图元: {filePath} \n");
}
else
{
tr.Abort();
ed.WriteMessage("\n 操作已取消 \n");
}
}
// 设置XData
CreateRegApp(doc, tagNumber);
using (Transaction transaction = destDb.TransactionManager.StartTransaction())
{
Entity ent01 = transaction.GetObject(oid, OpenMode.ForWrite) as Entity;
ResultBuffer rb = new ResultBuffer();
rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "HKSK_NODES"));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "HKSK_END"));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataHandle, oid.Handle.ToString()));
ent01.XData = rb;
transaction.Commit();
}
}
catch (Exception ex)
{
tr.Abort();
ed.WriteMessage($"\n错误: {ex.Message}\n");
}
}
return oid;
}
//生成唯一块名称
private static string GetUniqueBlockName(Database db, string baseName)
{
int count = 1;
string testName = baseName;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
while (bt.Has(testName))
{
testName = $"{baseName}_{count++}";
}
tr.Commit();
}
return testName;
}
///
/// 创建XData的注册名称APP
///
///
///
public static void CreateRegApp(this Document doc, string appName)
{
try
{
using (var documentLock = doc.LockDocument())
{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
RegAppTable table = (RegAppTable)trans.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
if (!table.Has(appName))
{
RegAppTableRecord regAppRec = new RegAppTableRecord();
regAppRec.Name = appName;
table.Add(regAppRec);
trans.AddNewlyCreatedDBObject(regAppRec, true);
}
trans.Commit();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 创建块字典
private static void AddValueToAcdbDictionary(Transaction tr, BlockReference blockRef, string key, string value)
{
// 1. 确保块参照有扩展字典
DBDictionary extDict = GetOrCreateExtensionDictionary(tr, blockRef);
// 2. 获取或创建acdbdictionary
DBDictionary acdbDict = GetOrCreateAcdbDictionary(tr, extDict);
// 3. 创建XRecord存储值
Xrecord valueXrec = new Xrecord();
tr.AddNewlyCreatedDBObject(valueXrec, true);
// 4. 设置XRecord数据
//ResultBuffer rb = new ResultBuffer(
// new TypedValue(1000, "块自定义数据"),
// new TypedValue(1000, key),
// new TypedValue(1000, value)
//);
//valueXrec.Data = rb;
// 5. 添加到acdbdictionary
acdbDict.SetAt(key, valueXrec);
}
private static DBDictionary GetOrCreateExtensionDictionary(Transaction tr, DBObject obj)
{
if (obj.ExtensionDictionary.IsNull)
{
// 创建新扩展字典
obj.UpgradeOpen();
obj.CreateExtensionDictionary();
}
return (DBDictionary)tr.GetObject(
obj.ExtensionDictionary, OpenMode.ForWrite);
}
private static DBDictionary GetOrCreateAcdbDictionary(Transaction tr, DBDictionary extDict)
{
const string acdbDictName = "StLegend";
if (extDict.Contains(acdbDictName))
{
return (DBDictionary)tr.GetObject(
extDict.GetAt(acdbDictName), OpenMode.ForWrite);
}
else
{
// 创建新acdbdictionary
DBDictionary acdbDict = new DBDictionary();
extDict.SetAt(acdbDictName, acdbDict);
tr.AddNewlyCreatedDBObject(acdbDict, true);
return acdbDict;
}
}
#endregion
#region 读取元件块,插入图纸
///
/// 读取元件块,插入图纸
///
/// 图元文件路径
/// 传入的位号
/// 位号值
/// 元件类型ID
/// 比例大小
/// 坐标位置
///
public static ObjectId AddTagDWG(string filePath, string tagName, string tag, string objTypeId, double scale, Point3d position)
{
if (scale == 0)
{ scale = 1; }
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
ObjectId oid = ObjectId.Null;
if (!File.Exists(filePath))
{
ed.WriteMessage("\n 错误:图元文件不存在!\n");
return oid;
}
// 获取当前数据库
Database destDb = HostApplicationServices.WorkingDatabase;
using (Transaction tr = destDb.TransactionManager.StartTransaction())
{
try
{
// 创建临时数据库读取外部DWG
using (Database sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(filePath, FileOpenMode.OpenForReadAndAllShare, false, null);
// 生成唯一块名(避免重名)
string blockName = GetUniqueBlockName(destDb, tagName);
// 将外部DWG转换为块定义
ObjectId blockId = destDb.Insert(blockName, sourceDb, true);
// 创建块参照
BlockReference br = new BlockReference(
Point3d.Origin, // 插入点(可修改)
blockId// bt[blockName]
);
br.Position = position;
// 设置比例和旋转
br.ScaleFactors = new Scale3d(scale); //比例因子
br.Rotation = 0.0; // 旋转角度(弧度)
// 获取实时鼠标位置
// 添加到当前模型空间
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(destDb),
OpenMode.ForWrite
);
// 处理插入结果
btr.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
//创建位号属性
var attDef = AddAttributeDefinition(btr, "HKSK_TAG", tag);
AttributeReference attRef = new AttributeReference();
attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
br.AttributeCollection.AppendAttribute(attRef);
tr.AddNewlyCreatedDBObject(attRef, true);
//添加字典
AddValueToAcdbDictionary(tr, br, objTypeId, "");
tr.Commit();
oid = br.Id;
ed.WriteMessage($"\n 成功插入图元: {filePath} \n");
}
// 设置XData
CreateRegApp(doc, tag);
using (Transaction transaction = destDb.TransactionManager.StartTransaction())
{
Entity ent01 = transaction.GetObject(oid, OpenMode.ForWrite) as Entity;
ResultBuffer rb = new ResultBuffer();
rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "HKSK_NODES"));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "HKSK_END"));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataHandle, oid.Handle.ToString()));
ent01.XData = rb;
transaction.Commit();
}
}
catch (Exception ex)
{
tr.Abort();
ed.WriteMessage($"\n错误: {ex.Message}\n");
}
}
return oid;
}
private static AttributeDefinition AddAttributeDefinition(BlockTableRecord btr, string tag, string value)
{
// 创建属性定义
AttributeDefinition attDef = new AttributeDefinition()
{
// 属性位置(在圆形下方)
Position = new Point3d(0, 100, 0),
// 属性文字设置
Height = 2, // 文字高度
Justify = AttachmentPoint.BaseMid, // 对齐
// 属性定义参数
Tag = tag,// 属性标签(唯一标识)
Prompt = "", // 提示信息
TextString = value, // 默认值
Layer = "0", // 图层
// 设置属性可见性
Invisible = false,
Visible = false // 可见
// 将属性定义添加到块
};
btr.AppendEntity(attDef);
return attDef;
}
#endregion
#region 获取当前图纸选择集数量
///
/// 获取当前图纸选择集数量
///
/// 选择集数量
public static int SelectedCount()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
// 获取当前用户选择的元素
PromptSelectionResult selResult = ed.GetSelection();
if (selResult.Status == PromptStatus.OK)
{
SelectionSet selection = selResult.Value;
int count = selection.Count;
return count;
}
else
{
return 0;
}
}
#endregion
#region 获取当前图纸选择集的句柄
///
/// 获取当前选中句柄
///
///
public static List GetSelectedHandles()
{
List handles = new List();
if (doc == null)
{ doc = Application.DocumentManager.MdiActiveDocument; }
if (ed == null)
{ ed = doc.Editor; }
if (db == null)
{ db = doc.Database; }
// 获取用户选择的元素
PromptSelectionResult selResult = ed.GetSelection();
if (selResult.Status != PromptStatus.OK)
{
ed.WriteMessage("\n未选中任何元素。");
return handles;
}
SelectionSet selection = selResult.Value;
// 开启事务以安全访问数据库
using (Transaction tr = db.TransactionManager.StartTransaction())
{
try
{
foreach (SelectedObject selectedObj in selection)
{
ObjectId objId = selectedObj.ObjectId;
if (!objId.IsValid) continue; // 跳过无效的 ObjectId
// 通过 ObjectId 获取实体对象
Entity entity = tr.GetObject(objId, OpenMode.ForRead) as Entity;
if (entity != null && entity.XData != null)
{
// 获取句柄(Handle 是字符串类型)
handles.Add(entity.Handle.ToString());
}
}
tr.Commit();
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
tr.Abort();
}
}
if (!handles.Any())
{
ed.WriteMessage("\n未找到有效句柄。");
}
return handles;
}
#endregion
#region 获取所有打开的图纸名称
///
/// 获取所有打开的图纸名称
///
public static List GetAllOpenDrawingNames()
{
List names = new List();
DocumentCollection docs = Application.DocumentManager;
foreach (Document doc in docs)
{
// 提取文件名(不包含路径)
//string fileName = Path.GetFileName(doc.Database.Filename);
//if (!string.IsNullOrEmpty(fileName))
names.Add(doc.Database.Filename);
}
return names;
}
#endregion
#region 保存图纸
///
/// 保存图纸
///
public static void SaveAndCloseDwg(string filename)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
if (db.Filename.Equals(filename))
{
doc.CloseAndSave(filename);
}
}
#endregion
#region 切换到指定名称的图纸
///
/// 切换到指定名称的图纸
///
public static bool SwitchToDocument(string fileName)
{
DocumentCollection docs = Application.DocumentManager;
var flag = false;
foreach (Document doc in docs)
{
if (doc.Name.Equals(fileName))
{
try
{
// 激活指定的文档
docs.MdiActiveDocument = doc;
}
catch { }
flag = true;
break;
}
}
return flag;
}
#endregion
#region 把当前图纸改成只读模式
///
/// 把当前图纸改成只读模式
///
public static void SetDrawingReadOnly(string fileName, bool isReadOnly)
{
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
// 检查当前文档是否已保存
db = doc.Database;
if (string.IsNullOrEmpty(db.Filename))
{
ed.WriteMessage("\n当前文档是未保存的新文件,无法以只读模式重新打开。");
return;
}
// 关闭当前文档,保存修改部分
string filePath = db.Filename;
if (!doc.IsReadOnly)
{
doc.CloseAndSave(fileName);
}
else { doc.CloseAndDiscard(); }
// 重新打开
Thread.Sleep(200);
Application.DocumentManager.Open(filePath, isReadOnly);
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
var msg = isReadOnly ? "只读" : "可编辑";
ed.WriteMessage($"\n当前图纸打开模式变更为:{msg}\n");
}
#endregion
#region 获取当前图纸所有句柄
///
/// 获取当前图纸XData不为空的所有句柄
///
///
public static List GetHandles()
{
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
List handles = new List();
try
{
// 开启事务
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 获取模型空间块表记录
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// 遍历模型空间中的所有实体
foreach (ObjectId objId in modelSpace)
{
Entity entity = tr.GetObject(objId, OpenMode.ForRead) as Entity;
if (entity != null && entity.XData != null)
{
// 提取句柄(十六进制格式)
handles.Add(entity.Handle.ToString());
}
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
}
return handles;
}
#endregion
#region 获取当前图纸XData不为空的所有实体
///
/// 获取当前图纸XData不为空的所有实体
///
/// 要删除的位号
///
public static List GetAllEntity(List listTagNumber)
{
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
List handles = new List();
try
{
// 开启事务
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 获取模型空间块表记录
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// 收集要删除的块参照
ObjectIdCollection idsToErase = new ObjectIdCollection();
// 遍历模型空间中的所有实体
foreach (ObjectId objId in btr)
{
Entity entity = tr.GetObject(objId, OpenMode.ForWrite) as Entity;
if (entity != null && entity.XData != null)
{
// 提取句柄(十六进制格式)
var blockRef = entity as BlockReference;
if (blockRef != null)
{
bool flag = true;
var dto = new DtoBasePoint()
{
Handle = entity.Handle.ToString(),
X = blockRef.Position.X,
Y = blockRef.Position.Y,
Z = blockRef.Position.Z
};
// 检查属性
// 检查属性集合
foreach (ObjectId attId in blockRef.AttributeCollection)
{
AttributeReference attRef = (AttributeReference)tr.GetObject(
attId, OpenMode.ForRead);
if (attRef.Tag == "HKSK_TAG")
{
dto.TagNumber = attRef.TextString;
if (listTagNumber != null && listTagNumber.Contains(attRef.TextString))
{
idsToErase.Add(objId);
flag = false;
}
break;
}
}
if (flag)
{ handles.Add(dto); }
}
}
}
if (idsToErase.Count > 0)
{
foreach (ObjectId id in idsToErase)
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
ent.Erase();
}
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
}
return handles;
}
#endregion
#region 关联云线
public static List SelectHandles = new List();
private static bool _isSelectionMode = false;
///
/// 关联云线
///
///
public static List StartLineSelection()
{
List handles = new List();
if (doc == null)
{ doc = Application.DocumentManager.MdiActiveDocument; }
if (ed == null)
{ ed = doc.Editor; }
try
{
// 启用选择模式
_isSelectionMode = true;
//ed.PointMonitor += OnPointMonitor; // 注册鼠标移动事件
// 设置选择过滤器
PromptSelectionOptions pso = new PromptSelectionOptions();
pso.MessageForAdding = "\n选择云线";
// 限制可选对象类型
SelectionFilter filter = new SelectionFilter(new[]
{
new TypedValue((int)DxfCode.Start, "POLYLINE") // 示例过滤类型 LINE,ARC,CIRCLE,POLYLINE
});
// 持续选择模式
while (_isSelectionMode)
{
PromptSelectionResult res = ed.GetSelection(pso);
if (res.Status == PromptStatus.OK)
{
handles = SelectHandles;
break;
}
else
{
_isSelectionMode = false;
}
}
}
finally
{
// 清理事件注册
//ed.PointMonitor -= OnPointMonitor;
ed.WriteMessage("\n已退出选择模式");
}
return handles;
}
private static void OnPointMonitor(object sender, PointMonitorEventArgs e)
{
if (!_isSelectionMode) return;
var ed = (Bricscad.EditorInput.Editor)sender;
//实时显示选择提示
using (Transaction tr = ed.Document.TransactionManager.StartTransaction())
{
// 获取当前光标下的对象
FullSubentityPath[] paths = e.Context.GetPickedEntities();
if (paths.Length > 0)
{
Entity ent = tr.GetObject(paths[0].GetObjectIds()[0], OpenMode.ForWrite) as Entity;
if (ent != null)
{
// 显示动态提示
e.Context.DrawContext.Geometry.Draw(ent);
//ent.ColorIndex = 1;
}
}
else
{
// ed.SetCursor(SysCursor.Arrow); // 非可选区域显示箭头
}
tr.Commit();
}
}
public static void WaitForConfirmation()
{
PromptPointOptions ptOpts = new PromptPointOptions("\n点击空白处确认或按ESC取消");
ptOpts.AllowNone = true;
while (true)
{
PromptPointResult ptRes = ed.GetPoint(ptOpts);
if (ptRes.Status == PromptStatus.Cancel)
{
_isSelectionMode = false;
return;
}
if (IsClickOnEmptyArea(ptRes.Value))
{
//handles = GetSelectedHandles();
//using (Transaction tr = db.TransactionManager.StartTransaction())
//{
// foreach (var kvp in _originalColors)
// {
// Entity line = tr.GetObject(kvp.Key, OpenMode.ForWrite) as Entity;
// if (line != null)
// {
// line.ColorIndex = kvp.Value;
// }
// }
// tr.Commit();
//}
//_originalColors.Clear();
_isSelectionMode = false;
return;
}
ed.WriteMessage("\n请点击空白区域确认选择!");
}
}
private static bool IsClickOnEmptyArea(Point3d clickPoint)
{
PromptSelectionResult res = ed.SelectCrossingWindow(
clickPoint.TransformBy(ed.CurrentUserCoordinateSystem),
clickPoint.TransformBy(ed.CurrentUserCoordinateSystem));
return res.Value == null || res.Value.Count == 0;
}
#endregion
#region 元件关联图元
///
/// 元件关联图元
///
///
public static List StartObjectTypeSelection()
{
List handles = new List();
if (doc == null)
{ doc = Application.DocumentManager.MdiActiveDocument; }
if (ed == null)
{ ed = doc.Editor; }
try
{
// 启用选择模式
_isSelectionMode = true;
//ed.PointMonitor += OnPointMonitor; // 注册鼠标移动事件
// 设置选择过滤器
PromptSelectionOptions pso = new PromptSelectionOptions();
pso.MessageForAdding = "\n选择图元";
// 持续选择模式
while (_isSelectionMode)
{
PromptSelectionResult res = ed.GetSelection(pso);
if (res.Status == PromptStatus.OK)
{
handles = SelectHandles;
break;
}
else
{
_isSelectionMode = false;
}
}
}
finally
{
// 清理事件注册
//ed.PointMonitor -= OnPointMonitor;
ed.WriteMessage("\n已退出选择模式");
}
return handles;
}
#endregion
#region 设置XDATA
///
/// 设置句柄的XData
///
/// 句柄列表
/// 位号
public static void SetXdata(List hands, string tagNumber)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
var ed = doc.Editor;
try
{
// 步骤2:通过句柄查找对象
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (var targetHandle in hands)
{
// 在模型空间查找对象
BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
ObjectId objId = ObjectId.Null;
foreach (ObjectId id in modelSpace)
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
if (ent.Handle.ToString() == targetHandle)
{
objId = id;
break;
}
}
if (!objId.IsValid)
{
//ed.WriteMessage("\n未找到匹配的图元");
return;
}
Entity entity = (Entity)tr.GetObject(objId, OpenMode.ForWrite);
if (entity.XData != null)
{ continue; }
// 步骤3:准备XData
ResultBuffer xdata = new ResultBuffer();
xdata.Add(new TypedValue(1001, tagNumber)); // 注册应用名
xdata.Add(new TypedValue(1000, "TEST")); // 字符串
xdata.Add(new TypedValue(1070, 2025)); // 短整型
xdata.Add(new TypedValue(1040, 3.1415)); // 双精度
// 步骤4:写入XData
RegAppTable rat = (RegAppTable)tr.GetObject(
db.RegAppTableId, OpenMode.ForRead);
// 注册应用程序(必须)
if (!rat.Has(tagNumber))
{
rat.UpgradeOpen();
RegAppTableRecord ratr = new RegAppTableRecord();
ratr.Name = tagNumber;
rat.Add(ratr);
tr.AddNewlyCreatedDBObject(ratr, true);
}
entity.XData = xdata;
}
tr.Commit();
ed.WriteMessage("\nXData设置成功!");
}
}
catch (Exception ex)
{
}
}
#endregion
#region 创建或获取图层ID
///
/// 创建或获取图层ID
///
/// 图层名
/// 颜色,默认:灰色-8
///
public static ObjectId GetOrCreateLayer(string layerName, Color color = null)
{
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
LayerTable layerTable = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
if (layerTable.Has(layerName))
{
return layerTable[layerName];
}
layerTable.UpgradeOpen();
LayerTableRecord layer = new LayerTableRecord
{
Name = layerName
};
if (color != null)
{ layer.Color = color; }
ObjectId layerId = layerTable.Add(layer);
tr.AddNewlyCreatedDBObject(layer, true);
tr.Commit();
return layerId;
}
}
#endregion
#region 获取所有图层名
///
/// 获取所有图层名
///
///
public static List GetAllLayerNames()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
List listNames = new List();
try
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 获取图层表
LayerTable layerTable = (LayerTable)tr.GetObject(
db.LayerTableId, OpenMode.ForRead);
// 收集图层名称
foreach (ObjectId layerId in layerTable)
{
LayerTableRecord layer = (LayerTableRecord)tr.GetObject(
layerId, OpenMode.ForRead);
listNames.Add(layer.Name);
}
tr.Commit();
}
}
catch (Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
}
return listNames;
}
#endregion
#region 批量设置元素到图层
///
/// 批量设置元素到图层
///
/// 选中的ObjectId元素
/// 底图名
/// 底图颜色
/// 块名
public static void SetEntityToLayer(List listObjectId, string layerName, Color color, string blockName = null)
{
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
ObjectId layerId = GetOrCreateLayer(layerName, color);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
//PromptSelectionResult selResult = ed.GetSelection();
//SelectionSet selection = selResult.Value;
//foreach (SelectedObject selectedObj in selection)
foreach (var objId in listObjectId)
{
if (!objId.IsValid || objId.IsErased) continue;
Entity entity = tr.GetObject(objId, OpenMode.ForWrite) as Entity;
if (entity == null) continue;
entity.LayerId = layerId;
if (color != null)
{ entity.Color = color; }
}
if (!string.IsNullOrEmpty(blockName))
{
// 1:确定插入点
Point3d insertionPoint = GetInsertionPoint(ed, listObjectId.ToArray());
// 2:创建块定义
ObjectId blockId = CreateBlockDefinition(db, blockName, listObjectId.ToArray(), insertionPoint);
// 3:插入块参照
InsertBlockReference(db, blockId, insertionPoint);
// 4:删除原始对象
DeleteOriginalEntities(db, listObjectId.ToArray());
}
tr.Commit();
}
return;
}
// 获取插入点(自动计算或用户指定)
private static Point3d GetInsertionPoint(Editor ed, ObjectId[] selectedIds)
{
// 自动计算选择集中心点
Extents3d overallExtents = new Extents3d();
using (Transaction tr = ed.Document.Database.TransactionManager.StartTransaction())
{
foreach (ObjectId id in selectedIds)
{
Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity;
if (ent?.GeometricExtents != null)
{
overallExtents.AddExtents(ent.GeometricExtents);
}
}
tr.Commit();
}
Point3d centerPoint = new Point3d(
(overallExtents.MinPoint.X + overallExtents.MaxPoint.X) / 2,
(overallExtents.MinPoint.Y + overallExtents.MaxPoint.Y) / 2,
0);
return centerPoint;
//// 提示用户确认或指定插入点
//PromptPointOptions ppo = new PromptPointOptions("\n指定插入点或按Enter使用中心点: ");
//ppo.BasePoint = centerPoint;
//ppo.UseBasePoint = true;
//ppo.AllowNone = true;
//PromptPointResult ppr = ed.GetPoint(ppo);
//return ppr.Status == PromptStatus.OK ? ppr.Value : centerPoint;
}
// 创建块定义
private static ObjectId CreateBlockDefinition(Database db, string blockName, ObjectId[] sourceIds, Point3d basePoint)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
// 检查块名是否已存在
//if (blockTable.Has(blockName))
//{
// // 删除现有块定义
// ObjectId existingId = blockTable[blockName];
// BlockTableRecord existingBtr = (BlockTableRecord)tr.GetObject(existingId, OpenMode.ForWrite);
// // 安全删除(检查是否被参照)
// if (!IsBlockReferenced(db, existingId))
// {
// existingBtr.Erase();
// }
// else
// {
// throw new InvalidOperationException($"块 '{blockName}' 已被参照,无法覆盖");
// }
//}
// 创建新块定义
BlockTableRecord newBtr = new BlockTableRecord
{
Name = blockName,
Origin = basePoint
};
// 添加到块表
blockTable.UpgradeOpen();
ObjectId blockId = blockTable.Add(newBtr);
tr.AddNewlyCreatedDBObject(newBtr, true);
// 克隆并添加源对象到块定义
IdMapping idMap = new IdMapping();
foreach (ObjectId sourceId in sourceIds)
{
DBObject sourceObj = tr.GetObject(sourceId, OpenMode.ForRead);
if (sourceObj is Entity sourceEntity)
{
Entity clonedEntity = (Entity)sourceEntity.Clone();
newBtr.AppendEntity(clonedEntity);
tr.AddNewlyCreatedDBObject(clonedEntity, true);
// 调整位置(相对于基点)
Vector3d translation = basePoint.GetVectorTo(sourceEntity.GeometricExtents.MinPoint);
clonedEntity.TransformBy(Matrix3d.Displacement(translation.Negate()));
}
}
tr.Commit();
return blockId;
}
}
//插入块参照
private static void InsertBlockReference(Database db, ObjectId blockId, Point3d insertionPoint)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
BlockReference blockRef = new BlockReference(insertionPoint, blockId);
modelSpace.AppendEntity(blockRef);
tr.AddNewlyCreatedDBObject(blockRef, true);
tr.Commit();
}
}
// 删除原始实体(可选)
private static void DeleteOriginalEntities(Database db, ObjectId[] sourceIds)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (ObjectId id in sourceIds)
{
if (id.IsValid && !id.IsErased)
{
DBObject obj = tr.GetObject(id, OpenMode.ForWrite);
obj.Erase();
}
}
tr.Commit();
}
}
// 检查块是否被参照
private static bool IsBlockReferenced(Database db, ObjectId blockId)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord blockDef = (BlockTableRecord)tr.GetObject(blockId, OpenMode.ForRead);
return blockDef.GetBlockReferenceIds(true, false).Count > 0;
}
}
#endregion
#region 获取当前图纸选择集的元素
///
/// 获取当前选中元素
///
///
public static List GetSelectedObjectId()
{
List result = new List();
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
// 获取用户选择的元素
PromptSelectionResult selResult = ed.GetSelection();
if (selResult.Status != PromptStatus.OK)
{
ed.WriteMessage("\n未选中任何元素。");
return result;
}
SelectionSet selection = selResult.Value;
// 开启事务以安全访问数据库
using (Transaction tr = db.TransactionManager.StartTransaction())
{
try
{
foreach (SelectedObject selectedObj in selection)
{
ObjectId objId = selectedObj.ObjectId;
if (!objId.IsValid) continue; // 跳过无效的 ObjectId
result.Add(objId);
}
tr.Commit();
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
tr.Abort();
}
}
if (!result.Any())
{
ed.WriteMessage("\n未找到有效句柄。");
}
return result;
}
#endregion
#region 检查块名是否已存在
///
/// 检查块名是否已存在
///
/// 块名
///
public static bool CheckHasBlockName(string blockName)
{
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
if (blockTable.Has(blockName))
{ return true; }
else { return false; }
}
}
#endregion
#region 获取所有顶级字典名称
///
/// 获取所有顶级字典名称
///
public static List GetTopLevelDictionaryNames()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DBDictionary nod = (DBDictionary)tr.GetObject(
db.NamedObjectsDictionaryId, OpenMode.ForRead);
return nod.Cast()
.Select(entry => entry.Key)
.ToList();
}
}
#endregion
#region 获取字典内容
///
/// 获取字典内容
///
public static Dictionary GetDictionaryContents(string dictionaryName)
{
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
var result = new Dictionary();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DBDictionary nod = (DBDictionary)tr.GetObject(
db.NamedObjectsDictionaryId, OpenMode.ForRead);
if (nod.Contains(dictionaryName))
{
DBDictionary dict = (DBDictionary)tr.GetObject(
nod.GetAt(dictionaryName), OpenMode.ForRead);
foreach (DBDictionaryEntry entry in dict)
{
// result[entry.Key] = GetDbObjectValue(tr, entry.Value);
}
}
tr.Commit();
}
return result;
}
private static string GetDxfCodeDescription(int dxfCode)
{
string res = string.Empty;
switch (dxfCode)
{
case 0:
res = "实体类型";
break;
case 1:
res = "主文本值";
break;
case 2:
res = "名称";
break;
case 3:
res = "其他文本值";
break;
case 4:
res = "附加文本";
break;
case 5:
res = "实体句柄";
break;
case 6:
res = "线型名称";
break;
case 7:
res = "文字样式名称";
break;
case 8:
res = "图层名称";
break;
case 10:
res = "X坐标";
break;
case 20:
res = "Y坐标";
break;
case 30:
res = "Z坐标";
break;
case 40:
res = "数值";
break;
case 50:
res = "角度";
break;
case 60:
res = "实体可见性";
break;
case 62:
res = "颜色编号";
break;
case 70:
res = "标志值";
break;
case 90:
res = "32位整数";
break;
case 100:
res = "子类标记";
break;
case 1000:
res = "扩展数据字符串";
break;
case 1001:
res = "扩展数据应用名称";
break;
case 1002:
res = "扩展数据控制字符串";
break;
case 1003:
res = "图层名称";
break;
case 1004:
res = "二进制数据";
break;
case 1005:
res = "数据库句柄";
break;
case 1010:
res = "X值";
break;
case 1020:
res = "Y值";
break;
case 1030:
res = "Z值";
break;
case 1040:
res = "双精度浮点值";
break;
case 1070:
res = "16位整数";
break;
case 1071:
res = "32位整数";
break;
}
return res;
}
private static Dictionary ProcessXRecord(Xrecord xrec)
{
var result = new Dictionary();
if (xrec.Data != null)
{
foreach (TypedValue tv in xrec.Data)
{
result[tv.TypeCode] = tv.Value;
}
}
return result;
}
#endregion
#region 保存当前图纸
///
/// 保存当前图纸的命令
///
public static void SaveCurrentDrawing()
{
// 获取当前活动文档
Document doc = Application.DocumentManager.MdiActiveDocument;
// 获取编辑器,用于输出信息
Editor ed = doc.Editor;
try
{
doc.Database.Save();
ed.WriteMessage("\n文档保存成功!");
}
catch (System.Exception ex)
{
// 捕获并显示错误信息
ed.WriteMessage("\n保存失败: " + ex.Message);
}
}
#endregion
#region 打开元件图纸,改变位号的属性值
///
/// 打开元件图纸,改变位号的属性值
///
/// 元件图纸路径
/// 位号属性名
/// 位号值
/// true:默认块,false:异性块
///
public static string UpdateCableNo(string dwgName, List listTagName, string tagNumber, bool IsNotDefaultSymbol, string tag, string system)
{
try
{
//OpenDwg(dwgName);
Application.DocumentManager.Open(dwgName);
//Thread.Sleep(1000);
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
var s = doc.Name;
// 开启事务
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 获取模型空间块表记录
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// 遍历模型空间中的所有实体
foreach (ObjectId objId in modelSpace)
{
Entity entity = tr.GetObject(objId, OpenMode.ForRead) as Entity;
if (entity != null)
{
// 提取句柄(十六进制格式)
var blockRef = entity as BlockReference;
if (blockRef != null)
{
// 检查属性
// 检查属性集合
foreach (ObjectId attId in blockRef.AttributeCollection)
{
AttributeReference attRef = (AttributeReference)tr.GetObject(
attId, OpenMode.ForWrite);
if (listTagName.Contains(attRef.Tag) && !IsNotDefaultSymbol)
{
attRef.TextString = tagNumber;
break;
}
if (IsNotDefaultSymbol)
{
if (attRef.Tag.ToLower() == "system")
{
attRef.TextString = system;
//if (tagNumber.Contains("-"))
//{
// attRef.TextString = tagNumber.Substring(0, tagNumber.LastIndexOf("-"));
//}
//else { attRef.TextString = tagNumber; }
}
else if (attRef.Tag.ToLower() == "tag")
{
attRef.TextString = tag;
//if (tagNumber.Contains("-"))
//{
// attRef.TextString = tagNumber.Substring(tagNumber.LastIndexOf("-") + 1);
//}
}
}
}
}
}
}
tr.Commit();
}
doc.CloseAndSave(dwgName);
Thread.Sleep(20);
return "";
}
catch (Exception ex)
{
SendMessage(ex.Message);
return ex.Message;
}
}
#endregion
#region 插入文本内容
public static string InsertTextInfo(List listTextInfo)
{
string res = string.Empty;
try
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
// 开始事务处理
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 打开当前空间(模型空间或图纸空间)用于写入
BlockTableRecord currentSpace = (BlockTableRecord)tr.GetObject(
db.CurrentSpaceId, OpenMode.ForWrite);
foreach (var textInfo in listTextInfo)
{
if (textInfo.IsMText)
{
// 创建多行文字对象
MText mText = new MText();
mText.Contents = textInfo.Text;
mText.Location = textInfo.Position;
mText.TextHeight = textInfo.Height;
mText.Width = textInfo.Width; // 设置文本宽度,控制自动换行
if (textInfo.Align == 0)
{
mText.Attachment = AttachmentPoint.MiddleLeft; // 设置对齐居左
}
else if (textInfo.Align == 1)
{
mText.Attachment = AttachmentPoint.BaseCenter; // 设置对齐居中
}
// 将文字添加到当前空间
currentSpace.AppendEntity(mText);
tr.AddNewlyCreatedDBObject(mText, true);
}
else
{
// 创建单行文字对象
DBText dbText = new DBText();
dbText.TextString = textInfo.Text;
dbText.Position = textInfo.Position;
dbText.AlignmentPoint = textInfo.Position;
dbText.Height = textInfo.Height;
if (textInfo.Align == 0)
{
dbText.HorizontalMode = TextHorizontalMode.TextLeft; // 设置对齐居左
}
else if (textInfo.Align == 1)
{
dbText.HorizontalMode = TextHorizontalMode.TextCenter; // 设置对齐居中
}
// 将文字添加到当前空间
currentSpace.AppendEntity(dbText);
tr.AddNewlyCreatedDBObject(dbText, true);
}
}
// 提交事务
tr.Commit();
}
return res;
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion
#region 读取源图纸,插入当前图纸
///
/// 读取源图纸,插入当前图纸
///
/// 源图纸路径
/// 块名
/// 坐标位置
///
public static ObjectId AddBlockDWG(string filePath, string blockName, Point3d position)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
ObjectId oid = ObjectId.Null;
if (!File.Exists(filePath))
{
ed.WriteMessage("\n 错误: 源图纸不存在!\n");
return oid;
}
// 获取当前数据库
Database destDb = HostApplicationServices.WorkingDatabase;
using (Transaction tr = destDb.TransactionManager.StartTransaction())
{
try
{
// 创建临时数据库读取外部DWG
using (Database sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(filePath, FileOpenMode.OpenForReadAndAllShare, false, null);
// 生成唯一块名(避免重名)
//string blockName = GetUniqueBlockName(destDb, blockName);
// 将外部DWG转换为块定义
ObjectId blockId = destDb.Insert(blockName, sourceDb, true);
// 创建块参照
BlockReference br = new BlockReference(
Point3d.Origin, // 插入点(可修改)
blockId// bt[blockName]
);
br.Position = position;
// 设置比例和旋转
br.ScaleFactors = new Scale3d(1.0); //比例因子
br.Rotation = 0.0; // 旋转角度(弧度)
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(destDb),
OpenMode.ForWrite
);
// 处理插入结果
btr.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
tr.Commit();
oid = br.Id;
}
}
catch (Exception ex)
{
tr.Abort();
ed.WriteMessage($"\n错误: {ex.Message}\n");
}
}
return oid;
}
#endregion
#region 材料表插入图标块
///
/// 读取元件块,插入图纸
///
/// 图元文件路径
/// 块名
/// 比例大小
/// 坐标位置
///
public static ObjectId AddBomSymbolDWG(string filePath, string symbolName, double scale, Point3d position)
{
if (scale == 0)
{ scale = 1; }
Document doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
ObjectId oid = ObjectId.Null;
if (!File.Exists(filePath))
{
ed.WriteMessage("\n 错误:图元文件不存在!\n");
return oid;
}
// 获取当前数据库
Database destDb = HostApplicationServices.WorkingDatabase;
using (Transaction tr = destDb.TransactionManager.StartTransaction())
{
try
{
// 创建临时数据库读取外部DWG
using (Database sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(filePath, FileOpenMode.OpenForReadAndAllShare, false, null);
// 生成唯一块名(避免重名)
string blockName = GetUniqueBlockName(destDb, symbolName);
// 将外部DWG转换为块定义
ObjectId blockId = destDb.Insert(blockName, sourceDb, true);
// 创建块参照
BlockReference br = new BlockReference(
Point3d.Origin, // 插入点(可修改)
blockId// bt[blockName]
);
br.Position = position;
// 设置比例和旋转
br.ScaleFactors = new Scale3d(scale); //比例因子
br.Rotation = 0.0; // 旋转角度(弧度)
// 获取实时鼠标位置
// 添加到当前模型空间
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(destDb),
OpenMode.ForWrite
);
// 处理插入结果
btr.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
//创建位号属性
//var attDef = AddAttributeDefinition(btr, "HKSK_TAG", tag);
//AttributeReference attRef = new AttributeReference();
//attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
//br.AttributeCollection.AppendAttribute(attRef);
//tr.AddNewlyCreatedDBObject(attRef, true);
tr.Commit();
oid = br.Id;
}
}
catch (Exception ex)
{
tr.Abort();
ed.WriteMessage($"\n错误: {ex.Message}\n");
}
}
return oid;
}
#endregion
#region 获取当前图纸的所有有标注信息的句柄
///
/// 获取当前图纸的所有有标注信息的句柄 ,XData第一个属性为(1001, "HKSK_LABEL")
///
///
public static List GetAllAnnotation()
{
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
List listInfo = new List();
try
{
// 开启事务
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 获取模型空间块表记录
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// 遍历模型空间中的所有实体
foreach (ObjectId objId in btr)
{
if (objId.ObjectClass.Name == "AcDbBlockReference")
{
BlockReference blockRef = (BlockReference)tr.GetObject(objId, OpenMode.ForRead);
if (blockRef.XData != null)
{
ResultBuffer rb = blockRef.XData;
if (HasTargetXData(rb, "HKSK_LABEL"))
{
TypedValue[] xdata = rb.AsArray();
for (int i = 1; i < xdata.Length; i++)
{
if (i + 1 >= xdata.Length)
{ break; }
TypedValue data1 = xdata[i];
TypedValue data2 = xdata[i + 1];
if (data1.TypeCode == 1000 && data2.TypeCode == 1005)
{
listInfo.Add(new DtoTagAnnotation()
{
TagHandId = objId.Handle.ToString(),
Name = data1.Value.ToString(),
LabelHandId = data2.Value.ToString(),
});
i++;
}
else { break; }
}
}
}
}
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
}
return listInfo;
}
private static bool HasTargetXData(ResultBuffer rb, string targetAppName)
{
if (rb == null) return false;
TypedValue[] data = rb.AsArray();
if (data.Length == 0) return false;
// 检查第一个TypedValue是否为(1001, "HKSK_LABEL")
TypedValue firstValue = data[0];
return firstValue.TypeCode == 1001 &&
firstValue.Value.ToString() == targetAppName;
}
#endregion
#region 获取当前图纸的所有Mtext
///
/// 获取当前图纸的所有Mtext
///
///
public static List GetAllMText()
{
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
List listMText = new List();
try
{
// 开启事务
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 获取模型空间块表记录
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// 遍历模型空间中的所有实体
foreach (ObjectId objId in btr)
{
Entity entity = tr.GetObject(objId, OpenMode.ForRead) as Entity;
if (entity is MText mtext)
{
listMText.Add(new DtoMText() { Text = mtext.Text, HandId = mtext.Handle.ToString() });
}
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
}
return listMText;
}
#endregion
#region 刷新文本信息
///
/// 刷新文本信息
///
///
public static string RefreshMTextInfo(List keyValues)
{
doc = Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
try
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (var item in keyValues)
{
Handle handleObj= new Handle(Convert.ToInt64(item.Key, 16));
// 通过句柄获取ObjectId
ObjectId objectId = db.GetObjectId(false, handleObj, 0);
// 获取对象并检查是否为MText
DBObject dbObj = tr.GetObject(objectId, OpenMode.ForWrite);
if (dbObj is MText mtext)
{
mtext.Contents = item.Value;
}
}
tr.Commit();
}
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion
}
}