示例#1
0
        private void DeleteExec([NotNull] IStyleItem styleItem)
        {
            var doc = AcadHelper.Doc;
            var db  = doc.Database;

            if (styleItem.Id.Database != db)
            {
                throw new Exception($"Переключись на чертеж '{db.Filename}'");
            }
            try
            {
                StyleTable.Delete(styleItem);
                Styles?.Remove(styleItem);
            }
            catch (Exception ex)
            {
                ShowMessage(ex.Message);
            }

            Inspector.Show();
        }
示例#2
0
        public override void Delete(IStyleItem styleItem)
        {
            var doc       = AcadHelper.Doc;
            var needTwice = false;

            using (doc.LockDocument())
                using (var t = doc.TransactionManager.StartTransaction())
                {
                    var dbo = styleItem.Id.GetObjectT <DBObject>(OpenMode.ForWrite);
                    if (dbo is BlockTableRecord btr)
                    {
                        foreach (var dbObject in btr.GetBlockReferenceIds(true, false).GetObjects <DBObject>(OpenMode.ForWrite))
                        {
                            var ownerName = dbObject.OwnerId.GetObject <BlockTableRecord>()?.Name;
                            Inspector.AddError("Удалено", $"Удалено вхождение блока из {ownerName}");
                            dbObject.Erase();
                        }

                        if (btr.IsDynamicBlock)
                        {
                            foreach (var anonymBtr in btr.GetAnonymousBlockIds().GetObjects <BlockTableRecord>())
                            {
                                foreach (var dbObject in anonymBtr.GetBlockReferenceIds(true, false)
                                         .GetObjects <DBObject>(OpenMode.ForWrite))
                                {
                                    var ownerName = dbObject.OwnerId.GetObject <BlockTableRecord>()?.Name;
                                    Inspector.AddError("Удалено", $"Удалено вхождение анонимного блока из {ownerName}");
                                    dbObject.Erase();
                                }
                            }
                        }

                        btr.Erase();
                    }
                    else
                    {
                        try
                        {
                            var replaceId   = ObjectId.Null;
                            var replaceName = string.Empty;
                            var table       = styleTableId.GetObjectT <DBObject>();
                            switch (table)
                            {
                            case SymbolTable st:
                                if (st is LayerTable lt)
                                {
                                    if (styleItem.Name == "0")
                                    {
                                        throw new Exception("Нельзя удалить 0 слой");
                                    }
                                    replaceId   = lt["0"];
                                    replaceName = "0";
                                }
                                else if (styleItem.Name != "ПИК" && st.Has("ПИК"))
                                {
                                    replaceId   = st["ПИК"];
                                    replaceName = "ПИК";
                                }
                                else if (styleItem.Name != "Standart" && st.Has("Standart"))
                                {
                                    replaceId   = st["Standart"];
                                    replaceName = "Standart";
                                }
                                else
                                {
                                    replaceId   = st.Cast <ObjectId>().FirstOrDefault(s => s != styleItem.Id);
                                    replaceName = replaceId.GetObject <SymbolTableRecord>()?.Name;
                                }

                                break;

                            case DBDictionary dict:
                                if (dict.Contains("ПИК"))
                                {
                                    if (dict["ПИК"] is DictionaryEntry entry)
                                    {
                                        replaceId   = (ObjectId)entry.Value;
                                        replaceName = "ПИК";
                                    }
                                }
                                else if (dict.Contains("Standart"))
                                {
                                    if (dict["Standart"] is DictionaryEntry entry)
                                    {
                                        replaceId   = (ObjectId)entry.Value;
                                        replaceName = "Standart";
                                    }
                                }

                                break;
                            }

                            if (dbo is LayerTableRecord)
                            {
                                ReplaceLayer(doc.Database, styleItem.Id, replaceId, replaceName);
                            }

                            // Найти все ссылки и зменить
                            var refs = dbo.GetReferences();
                            if (!replaceId.IsNull)
                            {
                                refs.SoftPointerIds.ForEach(p => ReplacePointer(p, styleItem.Id, replaceId, replaceName));
                                refs.HardPointerIds.ForEach(p => ReplacePointer(p, styleItem.Id, replaceId, replaceName));
                                needTwice = true;
                            }
                            else
                            {
                                dbo.Erase();
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Log.Error(ex, $"Ошибка замены референсов в стиле '{styleItem.Name}' в таблице стилей '{Name}'");
                        }
                    }

                    t.Commit();
                }

            if (needTwice)
            {
                using (doc.LockDocument())
                    using (var t = doc.TransactionManager.StartTransaction())
                    {
                        var dbo = styleItem.Id.GetObjectT <DBObject>(OpenMode.ForWrite);
                        dbo.Erase();
                        t.Commit();
                    }
            }
        }
示例#3
0
 public abstract void Delete(IStyleItem styleItem);