/// <summary> /// Перемещение объектов /// Открытая транзакция не требуется /// При отмене пользователем - объекты удаляются /// </summary> /// <param name="ed"></param> /// <param name="ids"></param> /// <param name="pt"></param> /// <returns></returns> public static bool Drag(this Editor ed, ObjectId[] ids, Point3d pt) { if (ids == null || !ids.Any()) return false; SelectionSet selSet = SelectionSet.FromObjectIds(ids); PromptPointResult ppr = ed.Drag(selSet, "\nТочка вставки:", (Point3d ptInput, ref Matrix3d mat) => { if (ptInput.IsEqualTo(pt)) return SamplerStatus.NoChange; mat = Matrix3d.Displacement(pt.GetVectorTo(ptInput)); //pt = ptInput; return SamplerStatus.OK; }); if (ppr.Status == PromptStatus.OK) { using (var t = ed.Document.TransactionManager.StartTransaction()) { foreach (var item in ids) { var mat = Matrix3d.Displacement(pt.GetVectorTo(ppr.Value)); var ent = item.GetObject(OpenMode.ForWrite, false, true) as Entity; ent.TransformBy(mat); } t.Commit(); } return true; } else { using (var t = ed.Document.TransactionManager.StartTransaction()) { foreach (var id in ids) { var ent = id.GetObject(OpenMode.ForWrite); ent.Erase(); } t.Commit(); } return false; } }
public static void SelectHoleToRemoveArea() { var holeIds = new ObjectId[0]; ObjectId parcelId = ObjectId.Null; Document document = Application.DocumentManager.MdiActiveDocument; document.Editor.WriteMessage("\n选择需要扣除面积的孔洞: "); var result = StartSelectPolyline(false); if (result.Status != PromptStatus.OK) { return; } // 洞 if (result.Value.Count >= 1) { holeIds = result.Value.GetObjectIds(); } // 检查地块是否封闭 using (var tr = document.Database.TransactionManager.StartTransaction()) { foreach (var objectId in holeIds) { var curve = tr.GetObject(objectId, OpenMode.ForRead) as Curve; if (curve != null && !curve.Closed) { document.Editor.WriteMessage("\n错误:选择的孔洞不封闭"); return; } } } // 外边界 Point3d pickedPoint; if (!SelectPolylineEntity("\n选择要扣除面积的地块界线: ", "\n实体错误", out parcelId, out pickedPoint) || parcelId == ObjectId.Null) { return; } // 检查地块是否封闭 using (var tr = document.Database.TransactionManager.StartTransaction()) { var curve = tr.GetObject(parcelId, OpenMode.ForRead) as Curve; if (curve != null && !curve.Closed) { document.Editor.WriteMessage("\n错误:选择的地块界线不封闭"); return; } } // 如果地块是合适的 if (parcelId.IsValid && holeIds.Any()) { foreach (var objectId in holeIds) { if (objectId == parcelId) { document.Editor.WriteMessage("\n错误:句柄为{0}的孔洞与地块边界相同", objectId.Handle); return; } if (!WithIn(objectId, parcelId)) { document.Editor.WriteMessage("\n错误:句柄为{0}的孔洞不在地块边界内部", objectId.Handle); return; } } // 新增孔洞到地块 var parcel = new ParcelPolygon(parcelId); parcel.AddHoleIds(holeIds); document.Editor.WriteMessage("\n将{0}个多边形设定为扣除面积的孔洞", holeIds.Count()); } }