Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 26-06-2014, 16:17:39

Название: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Алексей (IdeaSoft) от 26-06-2014, 16:17:39
Для версий AutoCAD c 2006-2015
Ранее использую команду zoom через командную строчку AutoCAD.
Делаю так:
Document.SendStringToExecute("_zoom _all ", True, True, False)

Возможно ли выполнить zoom не используя командную строку на .NET
и не открывая файл dwg в AutoCAD?
Ведь в базе чертежа должны быть мета-данные состояния последнего вида.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 26-06-2014, 16:40:46
Думаю что не получится, но можешь попробовать:
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.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Владимир Шу от 26-06-2014, 16:44:01
Можно еще тут посмотреть: http://through-the-interface.typepad.com/through_the_interface/2012/12/zooming-panning-and-orbiting-the-current-autocad-view-using-net.html и тут http://adn-cis.org/forum/index.php?topic=114.0
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 26-06-2014, 17:19:26
Boxa.Shu, эти оба варианта работают с чертежом, открытом в редакторе AutoCAD. Так что это не то, что хотел бы Алексей (IdeaSoft)
Точнее это позволяет избавится от запуска команды, но не позволяет работать с чертежом открытым через Database.ReadDwgFile()
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 26-06-2014, 17:24:31
Наверное самый простой метод для чертежа, открытого в редакторе AutoCAD, но без командной строки:
Код - C# [Выбрать]
  1. object acadObject = Application.AcadApplication;
  2. acadObject.GetType().InvokeMember("ZoomExtents",
  3.    BindingFlags.InvokeMethod, null, acadObject, null);
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Алексей (IdeaSoft) от 04-07-2014, 17:14:39
открытого в редакторе AutoCAD
Нужно как раз для неоткрытого чертежа. В работе мое приложение формирует файл с результатом. Область размещение примитивов каждый раз разная. Мне как таковой zoоm впрямую не нужен , а нужно просто передвинуть вид экрана, так что бы примитивы были видны, когда пользователь откроет файл в AutoCAD. Если zoom нельзя выполнить для неоткрытого файла в AutoCAD, то может можно как то задать параметры вида чертежа - просто задать начальные X, Y для чертежа. Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Дмитрий Загорулькин от 04-07-2014, 17:36:24
Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
Думаю, что это невозможно законными способами :)
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Алексей (IdeaSoft) от 04-07-2014, 18:16:34
Думаю, что это невозможно законными способами
А что тут незаконного. Любой двоичный файл можно открыть, записать в него что угодно.
Только вот в Autodesk нужно узнать в какую ячейку памяти записать положение чертежа и все.
Или просто пусть разработчики RealDWG сделают метод, который будет делать zoom.
Я же не прошу дать мне полное описание dwg формата, а только адрес ячейки по которому хранятся данные позиции чертежа. Причем можно даже предположить, что эти общие данные хранятся в "заголовочном" блоке файла.
К примеру описание старых форматов dwg 2000 года есть в открытом доступе в сети интернет. Не думаю, что "заголовок"
dwg-файла так уж сильно поменялся за последние 10 лет.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 04-07-2014, 19:11:17
Может это возможно просто записать напрямую, открыть файл dwg, как двоичный и записать по нужному адресу байты и все.
Только вот по какому адресу эти байты кто знает?   
Это нереально. Реальнее записать в DXF-файл, отредактировать соответствующие значения системных переменных, снова открыть и сохранить как DWG-файл. Думаю что другого способа не существует.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Алексей (IdeaSoft) от 04-07-2014, 19:16:17
Это нереально. Реальнее записать в DXF-файл, отредактировать соответствующие значения системных переменных, снова открыть и сохранить как DWG-файл. Думаю что другого способа не существует.

А ну в общем можно и так. Получается лишние действия со стороны алгоритма. Осталось только найти в DXF место, где хранятся данные положения вида чертежа. Хорошо, попробую так сделать.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 04-07-2014, 19:20:47
VIEWCTR - центр экрана в МСК
VIEWSIZE - высота экрана в единицах чертежа.
VIEWDIR - направление взгляда (если взгляд в плане МСК, то {0.0,0,0,1.0})
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 04-07-2014, 19:24:48
К примеру описание старых форматов dwg 2000 года есть в открытом доступе в сети интернет. Не думаю, что "заголовок"
dwg-файла так уж сильно поменялся за последние 10 лет.
1) Заголовок как и весь формат файла поменялся достаточно прилично.
2) Системные переменные находятся не в заголовке.
3) Autodesk мягко говоря не приветствует реверс-инжиниринг формата DWG-файла. И соотвественно мы это не обсуждаем. Точка.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 04-07-2014, 22:15:31
А ведь я был не прав, а вы все так просто сдались.  :)
Ну, во-первых, системные переменные  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.  
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Дима_ от 04-07-2014, 23:11:33
а вы все так просто сдались
А мы Вам на слово верим...
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Андрей Бушман от 05-07-2014, 10:24:07
верим...
верили... ;)
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 05-07-2014, 12:43:40
http://adn.autodesk.com/adn/servlet/devnote?siteID=4814862&id=14706830&linkID=4900509
Судя по второй ссылке (не проверял) - в пространстве Листа это можно осуществить, а вот в пространстве Модели только если чертеж загружен в редактор AutoCAD.
Оказалось, что те методы класса Editor, которые там используются, и которые недоступны при работе с незагруженной в редактор базой, нужны только для немедленного отображения изменений в редакторе AutoCAD.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Алексей_DX от 31-03-2017, 15:05:02
Здравствуйте. Использую немного измененный код из этого поста (http://adn-cis.org/forum/index.php?topic=831.msg3438#msg3438). Зуммирование не происходит. 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.  
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 31-03-2017, 19:46:02
Оригинальный код тоже не сработал?
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 31-03-2017, 21:13:48
Попробовал на этом чертеже оригинальный код. Что не так?



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


Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Алексей_DX от 04-04-2017, 13:30:35
Оригинальный код тоже не сработал?
Да, не срабатывал.
Не знаю, что случилось, но после выходных Ваш код заработал. Хотел отправить видео с демонстрацией, как ничего не работает, а оно заработало. Спасибо.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 04-04-2017, 13:41:00
Оригинальный код тоже не сработал?
Да, не срабатывал.
Не знаю, что случилось, но после выходных Ваш код заработал. Хотел отправить видео с демонстрацией, как ничего не работает, а оно заработало. Спасибо.
Это моё положительное влияние. :)
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: avc от 01-04-2020, 17:29:59
А если этот код на транзакции переписать (чтоб студия предупреждения не выдавала) ? Или тут принципиально надо через OpenId.Open ?
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Дмитрий Загорулькин от 01-04-2020, 20:03:35
Здесь можно любым способом объекты открывать - хоть напрямую, хоть через транзакцию. Главное, транзакцию запускать в правильной базе.
Название: Re: Выполнить zoom чертежа без открытия его в AutoCAD
Отправлено: Александр Ривилис от 01-04-2020, 20:06:31
А если этот код на транзакции переписать (чтоб студия предупреждения не выдавала) ? Или тут принципиально надо через OpenId.Open ?
Только для того, чтобы студия не ругалась?
Тогда вот тебе:
Код - C# [Выбрать]
  1. #pragma warning disable 0618