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

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

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Для версий AutoCAD c 2006-2015
Ранее использую команду zoom через командную строчку AutoCAD.
Делаю так:
Document.SendStringToExecute("_zoom _all ", True, True, False)

Возможно ли выполнить zoom не используя командную строку на .NET
и не открывая файл dwg в AutoCAD?
Ведь в базе чертежа должны быть мета-данные состояния последнего вида.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю что не получится, но можешь попробовать:
http://adndevblog.typepad.com/autocad/2012/11/wblock-to-and-zoom-in-side-database.html
http://adn.autodesk.com/adn/servlet/devnote?siteID=4814862&id=14706830&linkID=4900509
Судя по второй ссылке (не проверял) - в пространстве Листа это можно осуществить, а вот в пространстве Модели только если чертеж загружен в редактор AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Boxa.Shu, эти оба варианта работают с чертежом, открытом в редакторе AutoCAD. Так что это не то, что хотел бы Алексей (IdeaSoft)
Точнее это позволяет избавится от запуска команды, но не позволяет работать с чертежом открытым через Database.ReadDwgFile()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Наверное самый простой метод для чертежа, открытого в редакторе AutoCAD, но без командной строки:
Код - C# [Выбрать]
  1. object acadObject = Application.AcadApplication;
  2. acadObject.GetType().InvokeMember("ZoomExtents",
  3.    BindingFlags.InvokeMethod, null, acadObject, null);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
открытого в редакторе AutoCAD
Нужно как раз для неоткрытого чертежа. В работе мое приложение формирует файл с результатом. Область размещение примитивов каждый раз разная. Мне как таковой zoоm впрямую не нужен , а нужно просто передвинуть вид экрана, так что бы примитивы были видны, когда пользователь откроет файл в AutoCAD. Если zoom нельзя выполнить для неоткрытого файла в AutoCAD, то может можно как то задать параметры вида чертежа - просто задать начальные X, Y для чертежа. Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
« Последнее редактирование: 04-07-2014, 17:24:53 от Алексей (IdeaSoft) »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
Думаю, что это невозможно законными способами :)

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Думаю, что это невозможно законными способами
А что тут незаконного. Любой двоичный файл можно открыть, записать в него что угодно.
Только вот в Autodesk нужно узнать в какую ячейку памяти записать положение чертежа и все.
Или просто пусть разработчики RealDWG сделают метод, который будет делать zoom.
Я же не прошу дать мне полное описание dwg формата, а только адрес ячейки по которому хранятся данные позиции чертежа. Причем можно даже предположить, что эти общие данные хранятся в "заголовочном" блоке файла.
К примеру описание старых форматов dwg 2000 года есть в открытом доступе в сети интернет. Не думаю, что "заголовок"
dwg-файла так уж сильно поменялся за последние 10 лет.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
Это нереально. Реальнее записать в DXF-файл, отредактировать соответствующие значения системных переменных, снова открыть и сохранить как DWG-файл. Думаю что другого способа не существует.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Это нереально. Реальнее записать в DXF-файл, отредактировать соответствующие значения системных переменных, снова открыть и сохранить как DWG-файл. Думаю что другого способа не существует.

А ну в общем можно и так. Получается лишние действия со стороны алгоритма. Осталось только найти в DXF место, где хранятся данные положения вида чертежа. Хорошо, попробую так сделать.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
VIEWCTR - центр экрана в МСК
VIEWSIZE - высота экрана в единицах чертежа.
VIEWDIR - направление взгляда (если взгляд в плане МСК, то {0.0,0,0,1.0})
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
К примеру описание старых форматов dwg 2000 года есть в открытом доступе в сети интернет. Не думаю, что "заголовок"
dwg-файла так уж сильно поменялся за последние 10 лет.
1) Заголовок как и весь формат файла поменялся достаточно прилично.
2) Системные переменные находятся не в заголовке.
3) Autodesk мягко говоря не приветствует реверс-инжиниринг формата DWG-файла. И соотвественно мы это не обсуждаем. Точка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 01-04-2020, 17:23:12

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А ведь я был не прав, а вы все так просто сдались.  :)
Ну, во-первых, системные переменные  VIEWCTR, VIEWSIZE, VIEWDIR в dxf-файле не хранятся.
Информация хранится в AcDbViewportTableRecord с именем *Active и изменение именно её приводит к нужному результату.
И всё можно сделать без dxf-файла:

Код - 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.  
  8. [assembly: CommandClass(typeof(Rivilis.ZoomExtDb))]
  9.  
  10. namespace Rivilis
  11. {
  12.   public class ZoomExtDb
  13.   {
  14.     [CommandMethod("ZoomExtDB")]
  15.     public void zoomdb()
  16.     {
  17.       Microsoft.Win32.OpenFileDialog openFileDialog =
  18.         new Microsoft.Win32.OpenFileDialog();
  19.       openFileDialog.Title =
  20.         "Выберите dwg-файл";
  21.       openFileDialog.Filter = "dwg-файлы|*.dwg";
  22.       bool? bClickedOK = openFileDialog.ShowDialog();
  23.       if (!bClickedOK.HasValue || !bClickedOK.Value) return;
  24.       using (Database db = new Database(false, false)) {
  25.         db.ReadDwgFile(openFileDialog.FileName, FileOpenMode.OpenForReadAndReadShare, true, null);
  26.         Database prevDb = HostApplicationServices.WorkingDatabase;
  27.         HostApplicationServices.WorkingDatabase = db;
  28.         db.UpdateExt(true);
  29.         using (ViewportTable vTab = db.ViewportTableId.Open(OpenMode.ForRead) as ViewportTable) {
  30.           ObjectId acVptId = vTab["*Active"];
  31.           using (ViewportTableRecord vpTabRec = acVptId.Open(OpenMode.ForWrite) as ViewportTableRecord) {
  32.             double scrRatio = (vpTabRec.Width / vpTabRec.Height);
  33.             Matrix3d matWCS2DCS = Matrix3d.PlaneToWorld(vpTabRec.ViewDirection);
  34.             matWCS2DCS = Matrix3d.Displacement(vpTabRec.Target - Point3d.Origin) * matWCS2DCS;
  35.             matWCS2DCS = Matrix3d.Rotation(-vpTabRec.ViewTwist,
  36.                                             vpTabRec.ViewDirection,
  37.                                             vpTabRec.Target)
  38.                                             * matWCS2DCS;
  39.             matWCS2DCS = matWCS2DCS.Inverse();
  40.             Extents3d extents = new Extents3d(db.Extmin, db.Extmax);
  41.             extents.TransformBy(matWCS2DCS);
  42.             double width = (extents.MaxPoint.X - extents.MinPoint.X);
  43.             double height = (extents.MaxPoint.Y - extents.MinPoint.Y);
  44.             Point2d center = new Point2d((extents.MaxPoint.X + extents.MinPoint.X) * 0.5,
  45.                                          (extents.MaxPoint.Y + extents.MinPoint.Y) * 0.5);
  46.             if (width > (height * scrRatio))
  47.               height = width / scrRatio;
  48.             vpTabRec.Height = height;
  49.             vpTabRec.Width = height * scrRatio;
  50.             vpTabRec.CenterPoint = center;
  51.           }
  52.         }
  53.         HostApplicationServices.WorkingDatabase = prevDb;
  54.         db.SaveAs(openFileDialog.FileName.Substring(0,openFileDialog.FileName.Length-4) +
  55.           "_zoomExts.dwg", DwgVersion.Current);
  56.       }
  57.     }
  58.   }
  59. }
  60.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
а вы все так просто сдались
А мы Вам на слово верим...

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Оригинальный код тоже не сработал?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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



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


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

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

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

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

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

Оффлайн avc

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

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

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

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

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