protected bool AskContinueFix(string message, Editor editor) { var options = AcadPromptUtil.CreatePromptOptions <PromptKeywordOptions>(message, new string[] { "Yes", "No" }, new string[] { "是", "否" }, new char[] { 'Y', 'N' }); options.AllowNone = true; PromptResult promptResult = null; do { promptResult = editor.GetKeywords(options); } while (promptResult.Status != PromptStatus.OK && promptResult.Status != PromptStatus.Cancel && promptResult.Status != PromptStatus.None); if (promptResult.Status == PromptStatus.Cancel) { return(false); } if (promptResult.Status == PromptStatus.OK && promptResult.StringResult == "No") { return(false); } return(true); }
protected override bool CheckAndFixAllImpl(IEnumerable <ObjectId> ids) { var editor = Document.Editor; var algorithm = new BreakCrossingObjectsQuadTree(editor); var checkedIds = ids; var first = true; var lastCount = 0; using (var waitCursor = new WaitCursorSwitcher()) while (true) { var checkMessage = String.Format("\n{0}检查交叉对象...", first?"开始":"继续"); if (first) { first = false; } editor.WriteMessage(checkMessage); algorithm.Check(checkedIds); var count = algorithm.CrossingInfos.Count(); if (count == 0 || count == lastCount) { editor.WriteMessage("\n检测到0处交叉,无需修复\n"); editor.WriteMessage("\n提示:在删除重复对象之后,请再执行一次打断交叉对象,保证图形能够完全清理成功\n"); return(true); } lastCount = count; var message = String.Format("\n检测到{0}处交叉,是否打断?", count); if (!AcadPromptUtil.AskContinue(message, editor)) { return(true); } editor.WriteMessage("\n开始打断..."); var breakIdPairs = algorithm.Fix(eraseOld: true); // Need recheck // TODO: this is a temporary solution, will be modified for the new checked Ids set. checkedIds = MapCleanService.Instance.PrepareObjectIdsForCheck(); } }
protected override bool CheckAndFixAllImpl(IEnumerable <ObjectId> ids) { var editor = Document.Editor; var duplicateEraserAlgorithm = new DuplicateEntityEraserKdTree(Document.Editor, Tolerance); editor.WriteMessage("\n开始检查重复对象..."); duplicateEraserAlgorithm.Check(ids); var crossingInfos = duplicateEraserAlgorithm.CrossingInfos; if (crossingInfos == null || !crossingInfos.Any()) { editor.WriteMessage("\n没有检查到重复对象,无需修复\n"); return(true); } var message = String.Format("\n检查到{0}个重复对象,是否修复?", crossingInfos.Count()); if (!AcadPromptUtil.AskContinue(message, editor)) { return(true); } editor.WriteMessage("\n开始修复..."); using (var transaction = Document.Database.TransactionManager.StartTransaction()) { foreach (var curveCrossingInfo in crossingInfos) { var targetId = curveCrossingInfo.TargetId; if (targetId.IsErased) { continue; } var dbObj = transaction.GetObject(targetId, OpenMode.ForWrite); dbObj.Erase(); dbObj.Dispose(); } // Deal with the source duplicate var groups = crossingInfos.GroupBy(it => it.TargetId); foreach (var g in groups) { if (g.Count() <= 1) { continue; } bool first = true; foreach (var curveCrossingInfo in g) { if (first) { first = false; continue; } var sourceId = curveCrossingInfo.SourceId; if (sourceId.IsErased) { continue; } var dbObj = transaction.GetObject(sourceId, OpenMode.ForWrite); dbObj.Erase(); dbObj.Dispose(); } } transaction.Commit(); } editor.WriteMessage("\n修复所有重复对象成功!\n"); return(true); }