Как однострочный текст поместить в центр экрана

Автор Тема: Как однострочный текст поместить в центр экрана  (Прочитано 9493 раз)

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

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Всем доброго дня!
У меня такой вопрос. Как однострочный текст поместить в центр экрана?
Я знаю ObjectId элемента.
Желательно еще сделать масштабирование, чтобы элемент полностью высвечивался на экране.
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Лет 15 назад я написал такой код:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Interop; // Autodesk.AutoCAD.Interop.dll & Autodesk.AutoCAD.Interop.Common.dll
  8.  
  9. [assembly: CommandClass(typeof(ZoomLibrary.Zoom))]
  10.  
  11. namespace ZoomLibrary
  12. {
  13.   public class Zoom
  14.   {
  15.     static public void ZoomObject(ObjectId id, double zoomFactor)
  16.     {
  17.       Database db = HostApplicationServices.WorkingDatabase;
  18.       AcadApplication app = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  19.       Extents3d ext;
  20.       using (Transaction tr = db.TransactionManager.StartTransaction())
  21.       {
  22.         Entity en = (Entity)tr.GetObject(id, OpenMode.ForRead);
  23.         ext = en.GeomExtents;
  24.         tr.Commit(); // <-- !!!
  25.       }
  26.       Vector3d v = new Vector3d((ext.MinPoint - ext.MaxPoint).ToArray());
  27.       app.ZoomWindow((ext.MinPoint - v * 100.0 / zoomFactor).ToArray(),
  28.       (ext.MaxPoint + v * 100.0 / zoomFactor).ToArray());
  29.     }
  30.     // Define Command "TestZoom"
  31.     [CommandMethod("TestZoom")]
  32.     static public void TestZoom()
  33.     {
  34.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  35.       PromptEntityResult rse = ed.GetEntity("\nSelect Entity: ");
  36.       if (rse.Status == PromptStatus.OK)
  37.       {
  38.         double zoomFactor = 100.0;
  39.         PromptDoubleOptions pdo = new PromptDoubleOptions("\nEnter zoom factor (0...100) <100>: ");
  40.         pdo.UseDefaultValue = true; pdo.DefaultValue = zoomFactor;
  41.         pdo.AllowNegative = false; pdo.AllowZero = false; pdo.AllowNone = false;
  42.         PromptDoubleResult rsd = ed.GetDouble(pdo);
  43.         if (rsd.Status == PromptStatus.OK) zoomFactor = rsd.Value;
  44.         ZoomObject(rse.ObjectId, zoomFactor);
  45.       }
  46.     }
  47.   }
  48. }
Должно помочь. В принципе можно сборки Autodesk.AutoCAD.Interop.Common.dll и Autodesk.AutoCAD.Interop.dll не подключать если использовать dynamic
« Последнее редактирование: 16-12-2020, 12:43:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот еще один вариант с использованием рефлексии:
Код - C# [Выбрать]
  1. // using System.Reflection;
  2. public class Zoom
  3. {
  4.     public static void ZoomWindow(Point3d p1, Point3d p2)
  5.     {
  6.         object acad = Application.AcadApplication;
  7.         object[] pts = { p1.ToArray(), p2.ToArray() };
  8.         acad.GetType().InvokeMember("ZoomWindow", BindingFlags.DeclaredOnly | BindingFlags.Public |
  9.              BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, pts);
  10.     }
  11.     public static void ZoomExtents()
  12.     {
  13.         object acad = Application.AcadApplication;
  14.         acad.GetType().InvokeMember("ZoomExtents", BindingFlags.DeclaredOnly | BindingFlags.Public |
  15.              BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, null);
  16.     }
  17.     public static void ZoomScaled(double scale, int zoomScaleType)
  18.     {
  19.         // zoomScaleType :
  20.         //    acZoomScaledAbsolute  = 0
  21.         //    acZoomScaledRelative  = 1
  22.         //    acZoomScaledRelativePSpace  = 2
  23.         object acad = Application.AcadApplication;
  24.         acad.GetType().InvokeMember("ZoomScaled", BindingFlags.DeclaredOnly | BindingFlags.Public |
  25.              BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, new object[] { scale, zoomScaleType });
  26.     }
  27.     public static void ZoomCenter(Point3d pt, double magnitude)
  28.     {
  29.         object acad = Application.AcadApplication;
  30.         acad.GetType().InvokeMember("ZoomCenter", BindingFlags.DeclaredOnly | BindingFlags.Public |
  31.              BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, new object[] { pt.ToArray(), magnitude });
  32.     }
  33. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Спасибо. Саша, вы - чудо.
У меня не находит
Autodesk.AutoCAD.Runtime;
AcadApplication
GeomExtents

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда так:

Код - C# [Выбрать]
  1. // (C) Copyright 2020 by  
  2. //
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.Runtime;
  8. using System;
  9. using System.Reflection;
  10.  
  11. // This line is not mandatory, but improves loading performances
  12. [assembly: CommandClass(typeof(ZoomUtils.Zoom))]
  13.  
  14. namespace ZoomUtils
  15. {
  16.   public class Zoom
  17.   {
  18.     public static void ZoomWindow(Point3d p1, Point3d p2)
  19.     {
  20.       object acad = Application.AcadApplication;
  21.       object[] pts = { p1.ToArray(), p2.ToArray() };
  22.       acad.GetType().InvokeMember("ZoomWindow", BindingFlags.DeclaredOnly | BindingFlags.Public |
  23.            BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, pts);
  24.     }
  25.     public static void ZoomExtents()
  26.     {
  27.       object acad = Application.AcadApplication;
  28.       acad.GetType().InvokeMember("ZoomExtents", BindingFlags.DeclaredOnly | BindingFlags.Public |
  29.            BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, null);
  30.     }
  31.     public static void ZoomScaled(double scale, int zoomScaleType)
  32.     {
  33.       // zoomScaleType :
  34.       //    acZoomScaledAbsolute  = 0
  35.       //    acZoomScaledRelative  = 1
  36.       //    acZoomScaledRelativePSpace  = 2
  37.       object acad = Application.AcadApplication;
  38.       acad.GetType().InvokeMember("ZoomScaled", BindingFlags.DeclaredOnly | BindingFlags.Public |
  39.            BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, new object[] { scale, zoomScaleType });
  40.     }
  41.     public static void ZoomCenter(Point3d pt, double magnitude)
  42.     {
  43.       object acad = Application.AcadApplication;
  44.       acad.GetType().InvokeMember("ZoomCenter", BindingFlags.DeclaredOnly | BindingFlags.Public |
  45.            BindingFlags.Instance | BindingFlags.InvokeMethod, null, acad, new object[] { pt.ToArray(), magnitude });
  46.     }
  47.     static public void ZoomObject(ObjectId id, double zoomFactor)
  48.     {
  49.       Database db = HostApplicationServices.WorkingDatabase;
  50.       Extents3d ext;
  51.       using (Transaction tr = db.TransactionManager.StartTransaction())
  52.       {
  53.         Entity en = (Entity)tr.GetObject(id, OpenMode.ForRead);
  54.         ext = en.GeometricExtents;
  55.       }
  56.       Vector3d v = new Vector3d((ext.MinPoint - ext.MaxPoint).ToArray());
  57.       ZoomWindow(ext.MinPoint - v * 100.0 / zoomFactor, ext.MaxPoint + v * 100.0 / zoomFactor);
  58.     }
  59.   }
  60. }
  61.  

Саша, вы - чудо.

Я в курсе.  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Что за параметр magnitude в методе ZoomCenter?
Вы не могли бы написать метод TestZoom для этого класса.

Отмечено как Решение Александр Ривилис 27-11-2020, 22:58:46

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще один вариант:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6. using System;
  7. // using System.Reflection; // <- Не нужно
  8.  
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(ZoomUtils.ZoomDynamic))]
  11.  
  12. namespace ZoomUtils
  13. {
  14.   public class ZoomDynamic
  15.   {
  16.     public static void ZoomWindow(Point3d p1, Point3d p2)
  17.     {
  18.       dynamic acad = Application.AcadApplication;
  19.       acad.ZoomWindow(p1.ToArray(), p2.ToArray());
  20.     }
  21.     public static void ZoomExtents()
  22.     {
  23.       dynamic acad = Application.AcadApplication;
  24.       acad.ZoomExtents();
  25.     }
  26.     public static void ZoomScaled(double scale, int zoomScaleType)
  27.     {
  28.       // zoomScaleType :
  29.       //    acZoomScaledAbsolute  = 0
  30.       //    acZoomScaledRelative  = 1
  31.       //    acZoomScaledRelativePSpace  = 2
  32.       dynamic acad = Application.AcadApplication;
  33.       acad.ZoomScaled(scale, zoomScaleType);
  34.     }
  35.     public static void ZoomCenter(Point3d pt, double magnitude)
  36.     {
  37.       dynamic acad = Application.AcadApplication;
  38.       acad.ZoomCenter(pt.ToArray(), magnitude);
  39.     }
  40.     static public void ZoomObject(ObjectId id, double zoomFactor)
  41.     {
  42.       Database db = HostApplicationServices.WorkingDatabase;
  43.       Extents3d ext;
  44.       using (Transaction tr = db.TransactionManager.StartTransaction())
  45.       {
  46.         Entity en = (Entity)tr.GetObject(id, OpenMode.ForRead);
  47.         ext = en.GeometricExtents;
  48.       }
  49.       Vector3d v = new Vector3d((ext.MinPoint - ext.MaxPoint).ToArray());
  50.       ZoomWindow(ext.MinPoint - v * 100.0 / zoomFactor, ext.MaxPoint + v * 100.0 / zoomFactor);
  51.     }
  52.  
  53.     [CommandMethod("TestZoom")]
  54.     static public void TestZoom()
  55.     {
  56.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  57.       PromptEntityResult rse = ed.GetEntity("\nSelect Entity: ");
  58.       if (rse.Status == PromptStatus.OK)
  59.       {
  60.         double zoomFactor = 100.0;
  61.         PromptDoubleOptions pdo = new PromptDoubleOptions("\nEnter zoom factor (0...100) <100>: ");
  62.         pdo.UseDefaultValue = true; pdo.DefaultValue = zoomFactor;
  63.         pdo.AllowNegative = false; pdo.AllowZero = false; pdo.AllowNone = false;
  64.         PromptDoubleResult rsd = ed.GetDouble(pdo);
  65.         if (rsd.Status == PromptStatus.OK) zoomFactor = rsd.Value;
  66.         ZoomObject(rse.ObjectId, zoomFactor);
  67.       }
  68.     }
  69.   }
  70. }

Ну и проверка:

« Последнее редактирование: 26-11-2020, 21:47:24 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Теперь ругается на acad.ZoomWindow(p1.ToArray(), p2.ToArray());

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Странно, что методы принадлежат Application, а не Viewport или Layout. Я правильно понимаю, что все эти методы тупо масштабируют текущий открытый лист/вьюпорт модели? На нужный лист не переключат? В смысле, что еще надо написать гору кода, чтоб учесть соответствие текущего пространства и пространства заданного entity, найти тот вьюпорт, где виден этот Entity и что-то делать если нигде не виден... И еще модель бывает разбита на виды...

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
В какой сборке сидит System.Reflection?
Он не подключился.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Странно, что методы принадлежат Application, а не Viewport или Layout. Я правильно понимаю, что все эти методы тупо масштабируют текущий открытый лист/вьюпорт модели? На нужный лист не переключат? В смысле, что еще надо написать гору кода, чтоб учесть соответствие текущего пространства и пространства заданного entity, найти тот вьюпорт, где виден этот Entity и что-то делать если нигде не виден... И еще модель бывает разбита на виды...
Это через COM/ActiveX и только для активного вида.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Борис_С,
Не ленись. Гугл у нас еще никто не запретил.



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Саша, спасибо. Все получилось. :D

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Саша, есть еще один вопрос. У меня с левой стороны экрана висит диалоговое окно. Ширину его я знаю. Если не сложно, можно как-то подкорректировать метод ZoomObject, введя в него еще один параметр - ширину диалог. окна, так, чтобы элемент показывался справа от окна, т.е. чтобы окно его не закрывало?