Аудит после переключения на созданный лист в конкретном файле

Автор Тема: Аудит после переключения на созданный лист в конкретном файле  (Прочитано 13954 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
AutoCAD 2012 Enu x64 SP2
Windows 7 x64 Rus SP1

Имеется следующий код "Hello, World!":
Код - C# [Выбрать]
  1. /* © Андрей Бушман, 2014
  2.  * Commands.cs
  3.  */
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8.  
  9. #if AUTOCAD
  10. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  11. using Ap = Autodesk.AutoCAD.ApplicationServices;
  12. using Db = Autodesk.AutoCAD.DatabaseServices;
  13. using Ed = Autodesk.AutoCAD.EditorInput;
  14. using Gm = Autodesk.AutoCAD.Geometry;
  15. using Rt = Autodesk.AutoCAD.Runtime;
  16. using Hs = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices;
  17. using Us = Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices;
  18. #endif
  19.  
  20. [assembly: Rt.CommandClass(typeof(Bushman.CAD.Samples.LayoutSample.Commands))]
  21.  
  22. namespace Bushman.CAD.Samples.LayoutSample {
  23.  
  24.     public sealed class Commands {
  25.         [Rt.CommandMethod("test", Rt.CommandFlags.Modal)]
  26.         public void Test() {
  27.             Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  28.             if (null == doc)
  29.                 return;
  30.             using (doc.LockDocument()) {
  31.                 Ed.Editor ed = doc.Editor;
  32.                 Db.Database db = doc.Database;
  33.                 Db.LayoutManager lm = Db.LayoutManager.Current;
  34.  
  35.                 String layout_name = "My_Layout";
  36.  
  37.                 if (!lm.GetLayoutId(layout_name).IsNull) {
  38.                     ed.WriteMessage("Лист \"{0}\" уже существует. Операция прервана.\n",
  39.                         layout_name);
  40.                     return;
  41.                 }
  42.                 Db.ObjectId layout_id = lm.CreateLayout(layout_name);
  43.                 using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  44.                     Db.Layout layout = tr.GetObject(layout_id, Db.OpenMode.ForWrite)
  45.                         as Db.Layout;
  46.                     layout.Initialize();
  47.                     lm.CurrentLayout = layout_name;
  48.                     tr.Commit();
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
Если запускаю его в новом чертеже, созданном на основе шаблона acadiso.dwt, то после выполнения команды audit никаких ошибок не найдено.
Однако имеется некий пользовательский файл (переданный мне для тестирования), в котором по завершению работы команды test, команда audit находит две ошибки:
Цитировать
Command: audit
Fix any errors detected? [Yes/No] <N>:
Auditing Header
Auditing Tables
Auditing Entities Pass 1
Pass 1 300     objects auditedAcDbViewport(76A60)
           Paperspace vport layer Not "0"               "0"
AcDbViewport(76A60)               was not repaired.

Auditing Entities Pass 2

Pass 2 300     objects auditedAcDbViewport(76A60)
           Paperspace vport layer Not "0"               "0"
AcDbViewport(76A60)               was not repaired.
Auditing Blocks
 2       Blocks audited
Total errors found 2 fixed 0
Erased 0 objects
До запуска команды test в этом чертеже аудит ошибок не находит. Файл прикреплён ниже и содержит прокси-графику. Recovery находит и исправляет в файле одну ошибку, не выявленную аудитом (как я понял - объекты СПДС GraphiCS), однако после test по прежнему аудит находит две ошибки.

У кого какие идеи по поводу причины такого поведения?

Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не знаю с чем это связано, но переключение текущего слоя с "Размеры" на "0" приводит к тому, что после этого программа отрабатывает нормально и после неё _AUDIT ошибок не находит. Предварительно файл я его переименовал (у меня его имя начиналось с пробела) и удалил прокси-объекты (их было три штуки).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Предварительно файл я его переименовал (у меня его имя начиналось с пробела) и удалил прокси-объекты (их было три штуки).
Я не трогаю прокси. Но если предварительно переключиться на слой 0, то аудит действительно не находит ошибок.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ошибка не возникает, если убрать строчку:
Код - C# [Выбрать]
  1. layout.Initialize();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ошибка не возникает, если убрать строчку:
Код - C#: [Выделить]

    layout.Initialize();
Как раз layout.Initialize() создаёт ViewPort и помещает его на текущий слой, а _AUDIT это не нравится - он хочет чтобы ViewPort был на слое "0".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Этот ViewPort кривой какой-то создается. Я попробовал выделить его лиспом по метке, которую выдает AUDIT - подсветились четыре ручки в пустом месте листа. При этом, самого видового экрана не было видно.
Может быть, нельзя в одной транзакции инициализировать и делать лист текущим?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Может быть, нельзя в одной транзакции инициализировать и делать лист текущим?
Вполне возможно, что ты прав.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Не, не угадал. Попробовал вынести из транзакции назначение нового листа текущим - не помогло.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вполне возможно, что ты прав.
Похоже, что не прав:
Код - C# [Выбрать]
  1. Db.ObjectId layout_id = lm.CreateLayout(layout_name);
  2. using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  3.     Db.Layout layout = tr.GetObject(layout_id, Db.OpenMode.ForWrite)
  4.         as Db.Layout;
  5.     layout.Initialize();
  6.     // lm.CurrentLayout = layout_name;
  7.     tr.Commit();
  8. }
  9.  
  10. using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  11.     Db.Layout layout = tr.GetObject(layout_id, Db.OpenMode.ForWrite)
  12.         as Db.Layout;                    
  13.     lm.CurrentLayout = layout_name;
  14.     tr.Commit();
  15. }
не помогло.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Этот ViewPort кривой какой-то создается. Я попробовал выделить его лиспом по метке, которую выдает AUDIT - подсветились четыре ручки в пустом месте листа.
Да, что-то подобное и я наблюдал один раз. Затем я в настройках диалогового окна Options отключил автоматическое создание видового экрана при создании нового листа. Но это не помогло - аудит всё равно ругается. Поэтому и создал эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Похоже, что при помощи этого файла, невзначай, вскрылся какой-то очередной баг API.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вот такой код в обозначенном файле ошибок аудита не даёт:
Код - C# [Выбрать]
  1. /* © Андрей Бушман, 2014
  2.  * Commands.cs
  3.  */
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8.  
  9. #if AUTOCAD
  10. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  11. using Ap = Autodesk.AutoCAD.ApplicationServices;
  12. using Db = Autodesk.AutoCAD.DatabaseServices;
  13. using Ed = Autodesk.AutoCAD.EditorInput;
  14. using Gm = Autodesk.AutoCAD.Geometry;
  15. using Rt = Autodesk.AutoCAD.Runtime;
  16. using Hs = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices;
  17. using Us = Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices;
  18. #endif
  19.  
  20. [assembly: Rt.CommandClass(typeof(Bushman.CAD.Samples.LayoutSample.Commands))]
  21.  
  22. namespace Bushman.CAD.Samples.LayoutSample {
  23.  
  24.     public sealed class Commands {
  25.         [Rt.CommandMethod("test", Rt.CommandFlags.Modal)]
  26.         public void Test() {
  27.             Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  28.             if (null == doc)
  29.                 return;
  30.             using (doc.LockDocument()) {
  31.                 Ed.Editor ed = doc.Editor;
  32.                 Db.Database db = doc.Database;
  33.                 Db.LayoutManager lm = Db.LayoutManager.Current;
  34.  
  35.                 String layout_name = "My_Layout";
  36.  
  37.                 if (!lm.GetLayoutId(layout_name).IsNull) {
  38.                     ed.WriteMessage("Лист \"{0}\" уже существует. Операция прервана.\n",
  39.                         layout_name);
  40.                     return;
  41.                 }
  42.                 Db.ObjectId layout_id = lm.CreateLayout(layout_name);
  43.                 using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  44.                     Db.Layout layout = tr.GetObject(layout_id, Db.OpenMode.ForWrite)
  45.                         as Db.Layout;
  46.                     Db.ObjectId prew_layer_id = db.Clayer;
  47.                     db.Clayer = db.LayerZero;
  48.                     layout.Initialize();
  49.                     db.Clayer = prew_layer_id;
  50.                     lm.CurrentLayout = layout_name;
  51.                     tr.Commit();
  52.                 }
  53.             }
  54.         }
  55.     }
  56. }

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В 2015-м AutoCAD ситуация та же самая.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ошибок AUDITа не дает, но лист пустой показывает, пока не переключишься на другой и не вернешься в него снова.
Попробуй без инициализации - увидишь разницу.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
но лист пустой показывает, пока не переключишься на другой и не вернешься в него снова.
у меня он пустой и после переключения между листами.
Цитировать
Попробуй без инициализации - увидишь разницу.
в 2015-м разницы не вижу (сейчас перенастроен проект на эту версию).