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

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

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

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

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Boxa.Shu, эти оба варианта работают с чертежом, открытом в редакторе AutoCAD. Так что это не то, что хотел бы Алексей (IdeaSoft)
Точнее это позволяет избавится от запуска команды, но не позволяет работать с чертежом открытым через Database.ReadDwgFile()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *
  • Сообщений: 1189
  • Карма: 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
  • Карма: 737
Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
Думаю, что это невозможно законными способами :)

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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