/// <summary> /// 删除实体的缩放比例 /// </summary> /// <param name="entId">实体的Id</param> /// <param name="scaleNames">缩放比例名列表</param> public static void RemoveScale(this ObjectId entId, params string[] scaleNames) { //获取entId指示的实体对象 DBObject obj = entId.GetObject(OpenMode.ForRead); //如果实体对象支持注释缩放 if (obj.Annotative != AnnotativeStates.NotApplicable) { //获得对象所有的注释比例 List <ObjectContext> scales = entId.GetAllScales(); obj.UpgradeOpen();//切换实体为写的状态 //获取当前图形的对象比例管理器 ObjectContextManager ocm = obj.Database.ObjectContextManager; //获取当前图形的注释比例列表,名为ACDB_ANNOTATIONSCALES ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES"); //遍历需要设置的注释比例 foreach (string scaleName in scaleNames) { //获取名为scaleName的注释比例 ObjectContext scale = occ.GetContext(scaleName); //若不存在scaleName的注释比例,则结束本次循环 if (scale == null) { continue; } //删除名为scaleName的注释比例 ObjectContexts.RemoveContext(obj, scale); } obj.DowngradeOpen();//为了安全将实体切换为读的状态 } }
/// <summary> /// 在AutoCAD图形中插入块参照 /// </summary> /// <param name="spaceId">块参照要加入的模型空间或图纸空间的Id</param> /// <param name="layer">块参照要加入的图层名</param> /// <param name="blockName">块参照所属的块名</param> /// <param name="position">插入点</param> /// <param name="scale">缩放比例</param> /// <param name="rotateAngle">旋转角度</param> /// <returns>返回块参照的Id</returns> public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle) { ObjectId blockRefId; //存储要插入的块参照的Id Database db = spaceId.Database; //获取数据库对象 //以读的方式打开块表 BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead); //如果没有blockName表示的块,则程序返回 if (!bt.Has(blockName)) { return(ObjectId.Null); } //以写的方式打开空间(模型空间或图纸空间) BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite); //创建一个块参照并设置插入点 BlockReference br = new BlockReference(position, bt[blockName]); br.ScaleFactors = scale; //设置块参照的缩放比例 br.Layer = layer; //设置块参照的层名 br.Rotation = rotateAngle; //设置块参照的旋转角度 ObjectId btrId = bt[blockName]; //获取块表记录的Id //打开块表记录 BlockTableRecord record = (BlockTableRecord)btrId.GetObject(OpenMode.ForRead); //添加可缩放性支持 if (record.Annotative == AnnotativeStates.True) { ObjectContextCollection contextCollection = db.ObjectContextManager.GetContextCollection("ACDB_ANNOTATIONSCALES"); ObjectContexts.AddContext(br, contextCollection.GetContext("1:1")); } blockRefId = space.AppendEntity(br); //在空间中加入创建的块参照 db.TransactionManager.AddNewlyCreatedDBObject(br, true); //通知事务处理加入创建的块参照 space.DowngradeOpen(); //为了安全,将块表状态改为读 return(blockRefId); //返回添加的块参照的Id }
/// <summary> /// 在AutoCAD图形中插入块参照 /// </summary> /// <param name="spaceId">块参照要加入的模型空间或图纸空间的Id</param> /// <param name="layer">块参照要加入的图层名</param> /// <param name="blockName">块参照所属的块名</param> /// <param name="position">插入点</param> /// <param name="scale">缩放比例</param> /// <param name="rotateAngle">旋转角度</param> /// <param name="attNameValues">属性的名称与取值</param> /// <returns>返回块参照的Id</returns> public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle) { DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); ObjectId blockRefId; Database db = spaceId.Database; BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead); if (!bt.Has(blockName)) { return(ObjectId.Null); } BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite); BlockReference br = new BlockReference(position, bt[blockName]); br.ScaleFactors = scale; br.Layer = layer; br.Rotation = rotateAngle; ObjectId btrId = bt[blockName]; BlockTableRecord record = (BlockTableRecord)btrId.GetObject(OpenMode.ForRead); if (record.Annotative == AnnotativeStates.True) { ObjectContextCollection contextCollection = db.ObjectContextManager.GetContextCollection("ACDB_ANNOTATIONSCALES"); ObjectContexts.AddContext(br, contextCollection.GetContext("1:1")); } blockRefId = space.AppendEntity(br); db.TransactionManager.AddNewlyCreatedDBObject(br, true); space.DowngradeOpen(); docLock.Dispose(); return(blockRefId); }
/// <summary> /// Вставка блока с атрибутами /// </summary> /// <param name="promptCounter">0 - только вставка, 1 - с поворотом</param> /// <param name="tr">Транзакция</param> /// <param name="db">База данных чертежа</param> /// <param name="ed">Editor</param> /// <param name="blkDefId">ObjectId блока</param> /// <param name="attributes">Список имен атрибутов</param> /// <param name="isAnnotative">Аннотативность блока-исходника</param> /// <returns></returns> public static ObjectId InsertBlockRef( int promptCounter, Transaction tr, Database db, Editor ed, ObjectId blkDefId, List <string> attributes, bool isAnnotative) { var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); var blockReference = new BlockReference(Point3d.Origin, blkDefId); if (isAnnotative) { var ocm = db.ObjectContextManager; var occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES"); ObjectContexts.AddContext(blockReference, occ.CurrentContext); } var id = btr.AppendEntity(blockReference); tr.AddNewlyCreatedDBObject(blockReference, true); var jig = new BlockRefJig(blockReference, AppendAttribToBlock(tr, blockReference, attributes)); jig.SetPromptCounter(0); var res = ed.Drag(jig); if (res.Status == PromptStatus.OK) { if (promptCounter == 1) { jig.SetPromptCounter(promptCounter); res = ed.Drag(jig); if (res.Status == PromptStatus.OK) { return(id); } } else { return(id); } } blockReference.Erase(); return(ObjectId.Null); }
/// <summary> /// 为实体添加指定的注释比例 /// </summary> /// <param name="entId">实体的Id</param> /// <param name="scaleNames">注释比例名列表</param> public static void AttachScale(this ObjectId entId, params string[] scaleNames) { Database db = entId.Database; //获取entId指示的实体对象 DBObject obj = entId.GetObject(OpenMode.ForRead); //如果实体对象支持注释缩放 if (obj.Annotative != AnnotativeStates.NotApplicable) { //如果实体为块参照,则需要通过其所属的块表记录来设置可注释缩放 if (obj is BlockReference) { BlockReference br = obj as BlockReference; //打开对应的块表记录 BlockTableRecord btr = (BlockTableRecord)br.BlockTableRecord.GetObject(OpenMode.ForWrite); //设置块表记录为可注释缩放 btr.Annotative = AnnotativeStates.True; } //其它可注释缩放的实体,使其可注释缩放 else if (obj.Annotative == AnnotativeStates.False) { obj.Annotative = AnnotativeStates.True; } obj.UpgradeOpen();//切换实体为写的状态以添加注释比例 //获取当前图形的对象比例管理器 ObjectContextManager ocm = db.ObjectContextManager; //获取当前图形的注释比例列表,名为ACDB_ANNOTATIONSCALES ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES"); //遍历需要设置的注释比例 foreach (string scaleName in scaleNames) { //获取名为scaleName的注释比例 ObjectContext scale = occ.GetContext(scaleName); //若不存在scaleName的注释比例,则结束本次循环 if (scale == null) { continue; } //为实体添加名为scaleName的注释比例 ObjectContexts.AddContext(obj, scale); } obj.DowngradeOpen();//为了安全将实体切换为读的状态 } }
/// <summary> /// 获取实体拥有的所有缩放比例 /// </summary> /// <param name="entId">实体的Id</param> /// <returns>返回实体的缩放比例列表</returns> public static List <ObjectContext> GetAllScales(this ObjectId entId) { //声明一个列表对象,用于返回实体所拥有的所有的注释比例 List <ObjectContext> scales = new List <ObjectContext>(); DBObject obj = entId.GetObject(OpenMode.ForRead); if (obj.Annotative != AnnotativeStates.NotApplicable) { ObjectContextManager ocm = obj.Database.ObjectContextManager; ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES"); //遍历注释比例列表 foreach (ObjectContext oc in occ) { //如果实体拥有此注释比例 if (ObjectContexts.HasContext(obj, oc)) { scales.Add(oc);//将此注释比例添加到返回列表中 } } } return(scales);//返回实体所拥有的所有的注释比例 }