Посоветуйте способ отслеживания изменений в листах

Автор Тема: Посоветуйте способ отслеживания изменений в листах  (Прочитано 16318 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю, что с динамическими блоками этот код работать не будет.
Точно не работает. Точнее переименовывает, но AutoCAD показывает не новое имя, а имя динамического блока.
А вот так можно переименовать и анонимный динамический блок. При этом он перестает быть динамическим. Т.е. мы получаем статический блок, соответствующий текущему состоянию динамического блока.
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcRx = Autodesk.AutoCAD.Runtime;
  8. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  9. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  10. using AcGe = Autodesk.AutoCAD.Geometry;
  11. using AcEd = Autodesk.AutoCAD.EditorInput;
  12.  
  13. // This line is not mandatory, but improves loading performances
  14. [assembly: CommandClass(typeof(TestRename.MyCommands))]
  15.  
  16. namespace TestRename
  17. {
  18.   public class MyCommands
  19.   {
  20.     [CommandMethod("RenBlock")]
  21.     public void RenBlock()
  22.     {
  23.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  24.       AcEd.Editor ed = doc.Editor;
  25.       AcEd.PromptEntityOptions pr1 =
  26.         new AcEd.PromptEntityOptions("\nУкажите вставку блока для переименования: ");
  27.       pr1.SetRejectMessage("Это не вставка блока!");
  28.       pr1.AddAllowedClass(typeof(AcDb.BlockReference), true);
  29.       AcEd.PromptEntityResult res1 = ed.GetEntity(pr1);
  30.       if (res1.Status != AcEd.PromptStatus.OK) return;
  31.       AcDb.ObjectId idBtr = AcDb.ObjectId.Null;
  32.       bool isDynamic = false;
  33.       bool isUnnamed = false;
  34.       string old_name;
  35.       using (AcDb.BlockReference br =
  36.         res1.ObjectId.Open(AcDb.OpenMode.ForRead) as AcDb.BlockReference)
  37.       {
  38.         idBtr = br.BlockTableRecord;
  39.         isDynamic = br.IsDynamicBlock;
  40.         using (AcDb.BlockTableRecord btr =
  41.           idBtr.Open(AcDb.OpenMode.ForRead) as AcDb.BlockTableRecord)
  42.         {
  43.           old_name = btr.Name;
  44.           isUnnamed = btr.IsAnonymous;
  45.         }
  46.       }
  47.       AcEd.PromptStringOptions pr2 =
  48.         new AcEd.PromptStringOptions("\nУкажите новое имя блока: ");
  49.       pr2.DefaultValue = old_name;
  50.  
  51.       AcEd.PromptResult res2 = ed.GetString(pr2);
  52.       if (res2.Status != AcEd.PromptStatus.OK) return;
  53.  
  54.       string new_name = res2.StringResult;
  55.  
  56.       if (String.Compare(new_name, old_name, true) == 0) return;
  57.       if (AcDb.SymbolUtilityServices.ValidateCompatibleSymbolName(
  58.          new_name, true, false,
  59.          AcDb.SymbolUtilityServices.IsCompatibilityMode(doc.Database)) != AcRx.ErrorStatus.OK)
  60.       {
  61.         ed.WriteMessage("\nНедопустимое имя для блока \'{0}\'!", new_name);
  62.         return;
  63.       }
  64.       if (isDynamic && isUnnamed)
  65.       {
  66.         using (AcDb.BlockTableRecord btr =
  67.           idBtr.Open(AcDb.OpenMode.ForRead) as AcDb.BlockTableRecord)
  68.         {
  69.           try
  70.           {
  71.             AcDb.ObjectId idBtrNew = AcDb.ObjectId.Null;
  72.             using (AcDb.BlockTableRecord btr_new = new AcDb.BlockTableRecord())
  73.             {
  74.               btr_new.Name = new_name;
  75.               // btr_new.CopyFrom(btr);
  76.               btr_new.Origin = btr.Origin;
  77.               btr_new.BlockScaling = btr.BlockScaling;
  78.               btr_new.Annotative = btr.Annotative;
  79.               btr_new.Units = btr.Units;
  80.               using (AcDb.BlockTable bt = doc.Database.BlockTableId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTable)
  81.               {
  82.                 idBtrNew = bt.Add(btr_new);
  83.               }
  84.             }
  85.             AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();
  86.             foreach (AcDb.ObjectId id in btr) ids.Add(id);
  87.             AcDb.IdMapping map = new AcDb.IdMapping();
  88.             doc.Database.DeepCloneObjects(ids, idBtrNew, map, true);
  89.             using (AcDb.BlockReference br =
  90.               res1.ObjectId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockReference)
  91.             {
  92.               br.BlockTableRecord = idBtrNew;
  93.             }
  94.           }
  95.           catch
  96.           {
  97.             ed.WriteMessage("\nБлок \'{0}\' нельзя переименовать в \'{1}\'!",
  98.               old_name, new_name);
  99.           }
  100.         }
  101.       }
  102.       else
  103.       {
  104.         using (AcDb.BlockTableRecord btr =
  105.           idBtr.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord)
  106.         {
  107.           try
  108.           {
  109.             btr.Name = new_name;
  110.           }
  111.           catch
  112.           {
  113.             ed.WriteMessage("\nБлок \'{0}\' нельзя переименовать в \'{1}\'!",
  114.               old_name, new_name);
  115.           }
  116.         }
  117.       }
  118.     }
  119.   }
  120. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Например, на lisp она будет выглядеть так:
a_app не локализованно...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
a_app не локализованно...
Исправил. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн JohnJАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 1
  • c# autocad
  • Skype: johnj255work
Очень здорово! Спасибо!