Выполнить zoom чертежа без открытия его в AutoCAD

Автор Тема: Выполнить zoom чертежа без открытия его в AutoCAD  (Прочитано 20850 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
http://adn.autodesk.com/adn/servlet/devnote?siteID=4814862&id=14706830&linkID=4900509
Судя по второй ссылке (не проверял) - в пространстве Листа это можно осуществить, а вот в пространстве Модели только если чертеж загружен в редактор AutoCAD.
Оказалось, что те методы класса Editor, которые там используются, и которые недоступны при работе с незагруженной в редактор базой, нужны только для немедленного отображения изменений в редакторе AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей_DX

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Здравствуйте. Использую немного измененный код из этого поста. Зуммирование не происходит. AutoCAD 2015, архитектура. Подскажите, пожалуйста, что я делаю не так. Чертеж во вложении. Вот мой код:

Код - C# [Выбрать]
  1. [Rt.CommandMethod("zoom1")]
  2.         public static void zoomdb()
  3.         {
  4.            
  5.             System.Windows.Forms.OpenFileDialog openFileDialog =
  6.               new System.Windows.Forms.OpenFileDialog();
  7.             openFileDialog.Title =
  8.               "Выберите dwg-файл";
  9.             openFileDialog.Filter = "dwg-файлы|*.dwg";
  10.             DialogResult dr = openFileDialog.ShowDialog();
  11.             if (dr == DialogResult.Cancel) return;
  12.             using (Database db = new Database(false, false))
  13.             {
  14.                 db.ReadDwgFile(openFileDialog.FileName, FileOpenMode.OpenForReadAndReadShare, true, null);
  15.                 Database prevDb = HostApplicationServices.WorkingDatabase;
  16.                 HostApplicationServices.WorkingDatabase = db;
  17.                 db.UpdateExt(true);
  18.                 using (ViewportTable vTab = db.ViewportTableId.Open(OpenMode.ForRead) as ViewportTable)
  19.                 {
  20.                     ObjectId acVptId = vTab["*Active"];
  21.                     using (ViewportTableRecord vpTabRec = acVptId.Open(OpenMode.ForWrite) as ViewportTableRecord)
  22.                     {
  23.                         double scrRatio = (vpTabRec.Width / vpTabRec.Height);
  24.                         Matrix3d matWCS2DCS = Matrix3d.PlaneToWorld(vpTabRec.ViewDirection);
  25.                         matWCS2DCS = Matrix3d.Displacement(vpTabRec.Target - Point3d.Origin) * matWCS2DCS;
  26.                         matWCS2DCS = Matrix3d.Rotation(-vpTabRec.ViewTwist,
  27.                                                         vpTabRec.ViewDirection,
  28.                                                         vpTabRec.Target)
  29.                                                         * matWCS2DCS;
  30.                         matWCS2DCS = matWCS2DCS.Inverse();
  31.                         Extents3d extents = new Extents3d(db.Extmin, db.Extmax);
  32.                         extents.TransformBy(matWCS2DCS);
  33.                         double width = (extents.MaxPoint.X - extents.MinPoint.X);
  34.                         double height = (extents.MaxPoint.Y - extents.MinPoint.Y);
  35.                         Point2d center = new Point2d((extents.MaxPoint.X + extents.MinPoint.X) * 0.5,
  36.                                                      (extents.MaxPoint.Y + extents.MinPoint.Y) * 0.5);
  37.                         if (width > (height * scrRatio))
  38.                             height = width / scrRatio;
  39.                         vpTabRec.Height = height;
  40.                         vpTabRec.Width = height * scrRatio;
  41.                         vpTabRec.CenterPoint = center;
  42.                     }
  43.                 }
  44.                 HostApplicationServices.WorkingDatabase = prevDb;
  45.                 db.SaveAs(openFileDialog.FileName.Substring(0, openFileDialog.FileName.Length - 4) +
  46.                   "_zoomExts.dwg", DwgVersion.Current);
  47.             }
  48.            
  49.         }
  50.  

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробовал на этом чертеже оригинальный код. Что не так?



То, что не совсем точно показывается граница чертежа связано с тем, что мы имеем чертеж, который сохранён не с тем видом (т.е. соотношением высоты и ширины), которые есть в AutoCAD в данный момент. Если мы откроем чертеж test.dwg в AutoCAD и просто сохраним его, то результат команды ZoomExtDb будет значительно лучше (но он будет зависеть от соотношения сторон окна редактора AutoCAD):


« Последнее редактирование: 31-03-2017, 22:15:43 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей_DX

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Оригинальный код тоже не сработал?
Да, не срабатывал.
Не знаю, что случилось, но после выходных Ваш код заработал. Хотел отправить видео с демонстрацией, как ничего не работает, а оно заработало. Спасибо.

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

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

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
А если этот код на транзакции переписать (чтоб студия предупреждения не выдавала) ? Или тут принципиально надо через OpenId.Open ?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здесь можно любым способом объекты открывать - хоть напрямую, хоть через транзакцию. Главное, транзакцию запускать в правильной базе.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А если этот код на транзакции переписать (чтоб студия предупреждения не выдавала) ? Или тут принципиально надо через OpenId.Open ?
Только для того, чтобы студия не ругалась?
Тогда вот тебе:
Код - C# [Выбрать]
  1. #pragma warning disable 0618
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение