コード例 #1
0
        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);
        }
コード例 #2
0
        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();
                }
        }
コード例 #3
0
        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);
        }