Управление ucs в фоне

Автор Тема: Управление ucs в фоне  (Прочитано 32350 раз)

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

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Управление ucs в фоне
« Ответ #15 : 27-02-2014, 09:21:04 »
Объясни зачем ты меняешь систему координат. Может можно обойтись другими средствами.
Подготовка заданий смежникам, среди прочей обработки в модели UCS должна быть сброшена в WCS. Хотел обрабатывать файл в фоне, без мельтешения. Пока приходится ради ucs пользоваться editor'ом.
Но кроме всего прочего теперь уже действительно интересно
почему SetUcsToWorld не работает должным образом? Если для корректной работы обозначенного метода требуется подправить код, то какие именно правки нужны?
Ведь в SDK написано
Цитировать
This function sets the UCS for the view or viewport table record to the world UCS.
И из-за этой, как оказалось, пустой фразы было потеряно достаточно много времени!
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #16 : 27-02-2014, 10:05:10 »
И из-за этой, как оказалось, пустой фразы было потеряно достаточно много времени!
Фраза не пустая. Почувствуй разницу между "установить МСК для видового порта" и "установить МСК для чертежа". В редакторе AutoCAD есть метод Editor.UpdateTiledViewportsFromDatabase, который приводит в соответствие видовой порт с базой и соответственно и ПСК должна стать такой, как у активного вида. Но как сделать это без загрузки в редактор - я пока не знаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Управление ucs в фоне
« Ответ #17 : 27-02-2014, 10:18:57 »
Александр, мне не нужно устанавливать новую МСК для чертежа. Мне нужно, что бы пользователь открыл модель получившегося файла и увидел, что там ПСК установлена в МСК (менять расположение  самой МСК я не имею права).
В моем понимании, это именно "Установить ПСК видового экрана модели в МСК"
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #18 : 27-02-2014, 10:25:14 »
Александр, мне не нужно устанавливать новую МСК для чертежа.
А это и принципиально невозможно. МСК она и в Африке МСК - она единая и единственная. И поэтому новой быть не может.

В моем понимании, это именно "Установить ПСК видового экрана модели в МСК"
Нет ПСК видового экрана и ПСК чертежа - это две совершенно разных вещи. Ты сам смог в этом убедится. У твоего видового экрана действительно ПСК стало равным МСК, но это никак не повлияло на ПСК чертежа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #19 : 27-02-2014, 10:58:03 »
Почувствуй разницу между "установить МСК для видового порта" и "установить МСК для чертежа".

Давайте почувствуем разницу вместе... Итак, поехали:

Код - C# [Выбрать]
  1. // © Andrey Bushman, 2014
  2. // Тестирование метода ViewportTableRecord.SetUcsToWorld().
  3. // Обсуждение здесь: http://adn-cis.org/forum/index.php?topic=559.0
  4. using System;
  5. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  6. using Ap = Autodesk.AutoCAD.ApplicationServices;
  7. using Db = Autodesk.AutoCAD.DatabaseServices;
  8. using Ed = Autodesk.AutoCAD.EditorInput;
  9. using Gm = Autodesk.AutoCAD.Geometry;
  10. using Rt = Autodesk.AutoCAD.Runtime;
  11.  
  12. [assembly: Rt.CommandClass(typeof(AndreyBushman.Samples.TestClass))]
  13.  
  14. namespace AndreyBushman.Samples {
  15.  
  16.         public sealed class TestClass {
  17.  
  18.                 [Rt.CommandMethod("test", Rt.CommandFlags.Session)]
  19.                 public static void Test() {
  20.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  21.                         // Предполагается, что DWG присутствует, в нём один лист (он же текущий)
  22.                         // и на этом листе текущим является единственный видовой экран.
  23.                         const String path = @"C:\test\test.dwg";
  24.                         Db.Database prevDb = Db.HostApplicationServices.WorkingDatabase;
  25.                         Db.Database db = new Db.Database(false, true);
  26.                         db.ReadDwgFile(path, System.IO.FileShare.ReadWrite, true, null);
  27.                         db.CloseInput(true);
  28.                         Db.HostApplicationServices.WorkingDatabase = db;
  29.                         using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  30.                                 ed.WriteMessage("Current layout name: {0}\n", Db.LayoutManager.Current.CurrentLayout);
  31.                                 ed.WriteMessage("Current viewport name: {0}\n", Db.SymbolUtilityServices.ViewportActiveName);
  32.                                 Db.ViewportTable vt = (Db.ViewportTable)tr.GetObject(db.ViewportTableId,
  33.                                         Db.OpenMode.ForRead);
  34.                                 Db.ViewportTableRecord vtr = (Db.ViewportTableRecord)tr.GetObject(
  35.                                         vt[Db.SymbolUtilityServices.ViewportActiveName], Db.OpenMode.ForWrite);
  36.  
  37.                                 vtr.SetUcsToWorld(); // не сработало: не назначена WCS                           
  38.                                 tr.Commit();
  39.                         }
  40.                         Db.HostApplicationServices.WorkingDatabase = prevDb;
  41.                         db.SaveAs(path, Db.DwgVersion.Current);
  42.                 }
  43.         }
  44. }
  45.  

Как обозначено в комментариях, в файле test.dwg текущим является некоторый видовой экран на листе. Однако и в этом случае не срабатывает SetUcsToWorld (вообще никаких изменений не наблюдаю). Может я в коде чего не так сделал? Тестовый файл прилагается.

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Управление ucs в фоне
« Ответ #20 : 27-02-2014, 11:47:20 »
По моему ошибка (недочет) не в этом api, а во время открытия файла в редакторе, если открыв такой файл прыгуть лист-модель и обратно - то UCS редактора придет в соответствие с db, причем если просто запустить _regenall - не помогает. Как вариант вижу только добавить в автозагрузку UpdateTiledViewportsFromDatabase().
з.ы. автокад ИХМО вобще слишком много ненужного кэширует, при сохранении файла - я понимаю по работе это существенно влияет на скорость процесса, но для сохранения в файл - у него явная избыточность - что иногда и приводит к таким противоречиеям.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #21 : 27-02-2014, 12:33:31 »
Я попробовал вызывать SetUcsToWorld не у ViewportTableRecord, а у Viewport. Вообще, поскольку обозначенный метод присутствует у обоих классов, то он должен работать, иначе нет смысла в его существовании.

Код - C# [Выбрать]
  1. // © Andrey Bushman, 2014
  2. // Тестирование метода ViewportTableRecord.SetUcsToWorld().
  3. // Обсуждение здесь: http://adn-cis.org/forum/index.php?topic=559.0
  4. using System;
  5. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  6. using Ap = Autodesk.AutoCAD.ApplicationServices;
  7. using Db = Autodesk.AutoCAD.DatabaseServices;
  8. using Ed = Autodesk.AutoCAD.EditorInput;
  9. using Gm = Autodesk.AutoCAD.Geometry;
  10. using Rt = Autodesk.AutoCAD.Runtime;
  11.  
  12. [assembly: Rt.CommandClass(typeof(AndreyBushman.Samples.TestClass))]
  13.  
  14. namespace AndreyBushman.Samples {
  15.  
  16.         public sealed class TestClass {
  17.  
  18.                 [Rt.CommandMethod("test", Rt.CommandFlags.Session)]
  19.                 public static void Test() {
  20.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  21.                         // Предполагается, что DWG присутствует, в нём один лист (он же текущий)
  22.                         // и на этом листе текущим является единственный видовой экран.
  23.                         const String path = @"C:\test\test.dwg";
  24.                         Db.Database prevDb = Db.HostApplicationServices.WorkingDatabase;
  25.                         Db.Database db = new Db.Database(false, true);
  26.                         db.ReadDwgFile(path, System.IO.FileShare.ReadWrite, true, null);
  27.                         db.CloseInput(true);
  28.                         Db.HostApplicationServices.WorkingDatabase = db;
  29.                         using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  30.                                 Db.ViewportTable vt = (Db.ViewportTable)tr.GetObject(db.ViewportTableId,
  31.                                         Db.OpenMode.ForRead);
  32.                                 Db.ViewportTableRecord vtr = (Db.ViewportTableRecord)tr.GetObject(
  33.                                         vt[Db.SymbolUtilityServices.ViewportActiveName], Db.OpenMode.ForWrite);
  34.  
  35.                                 Db.Layout layout = tr.GetObject(Db.LayoutManager.Current.GetLayoutId(
  36.                                         Db.LayoutManager.Current.CurrentLayout), Db.OpenMode.ForWrite) as Db.Layout;
  37.                                 layout.LayoutName += "+";
  38.  
  39.                                 // Для одного и того же файла я получаю здесь то 2, то 1 в разных сеансах работы. Почему?
  40.                                 Int16 cvportIndex = (Int16)cad.GetSystemVariable("CVPORT");
  41.                                 // Здесь количество элементов всегда 2
  42.                                 Db.ObjectIdCollection ids = layout.GetViewports();
  43.  
  44.                                 Db.Viewport vp = tr.GetObject(ids[1], // пока задал 1 вместо cvportIndex
  45.                                         Db.OpenMode.ForWrite) as Db.Viewport;
  46.  
  47.                                 Boolean vpLocked = vp.Locked;
  48.                                 vp.Locked = false;
  49.                                 // Меняю цвет видового экрана, с которым работаю
  50.                                 vp.Color = Autodesk.AutoCAD.Colors.Color.FromColor(System.Drawing.Color.Red);
  51.                                 vp.SetUcsToWorld(); // это работает
  52.                                 vp.Locked = vpLocked;
  53.  
  54.                                 // vtr.SetUcsToWorld(); // это не работает
  55.  
  56.                                 ed.WriteMessage("Current layout name: {0}\n", Db.LayoutManager.Current.CurrentLayout);
  57.                                 ed.WriteMessage("Current viewport name: {0}\n", Db.SymbolUtilityServices.ViewportActiveName);
  58.  
  59.                                 tr.Commit();
  60.                         }
  61.                         Db.HostApplicationServices.WorkingDatabase = prevDb;
  62.                         db.SaveAs(path, Db.DwgVersion.Current);
  63.                 }
  64.         }
  65. }

1. Прошу обратить внимание на блок кода в строках 39-42.

2. Если по выполнении приведённого в этом сообщении кода открыть файл test.dwg и не производя зуммирования попытаться выполнить команду pline, указав в качестве базовой точки координаты 0,0, то получаем то, что показано на 1-й картинке (обратите внимание на ориентацию курсора). Но если сначала пошевелить колёсиком мышки, тем самым выполнив предварительное зуммирование, то вид обновляется и дальнейший вызов pline 0,0 выполняется корректно: см. 2-ю картинку.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #22 : 27-02-2014, 12:34:28 »
Как вариант вижу только добавить в автозагрузку UpdateTiledViewportsFromDatabase().
Я все-так рассчитываю, что мы что-то упустили и ADN DevHelp нам поможет. Ну или точно скажут, что это невозможно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #23 : 27-02-2014, 12:53:16 »
Ну или точно скажут, что это невозможно.
Ну тогда уж пусть сразу показывают пример, когда метод ViewportTableRecord.SetUcsToWorld() работает...

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #24 : 27-02-2014, 12:53:57 »
Код - C# [Выбрать]
  1. Int16 cvportIndex = (Int16)cad.GetSystemVariable("CVPORT");
Это работает для текущего чертежа в редакторе AutoCAD и никак не связано с Database для чертежа, который не открыт в редакторе.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #25 : 27-02-2014, 12:55:55 »
Это работает для текущего чертежа в редакторе AutoCAD и никак не связано с Database для чертежа, который не открыт в редакторе.
Ну тогда возникает законный вопрос: как в Database, открытой обозначенным выше способом, получить текущий видовой экран (Viewport) на листе?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #26 : 27-02-2014, 12:56:15 »
Ну тогда уж пусть сразу показывают пример, когда метод ViewportTableRecord.SetUcsToWorld() работает...
Эти методы работают! Посмотри свойства активной ViewportTableRecord. Но (!!!) данные не переносятся на Database.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #27 : 27-02-2014, 12:58:05 »
Эти методы работают! Посмотри свойства активной ViewportTableRecord. Но (!!!) данные не переносятся на Database.
Мне важен конечный результат. Если ожидаемого результата нет, то вряд ли стоит это считать корректной работой. ИМХО.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #28 : 27-02-2014, 13:10:47 »
Мне важен конечный результат. Если ожидаемого результата нет, то вряд ли стоит это считать корректной работой. ИМХО.
Мы говорим на разных языках? Я объясняю, что ты неправильно понял смысл этого метода. Он меняет установки UCS для ViewportTableRecord. И всё! И так и должно быть. А вот как установить UCS в WCS для Database - это уже другой вопрос, на который ответа мы пока не знаем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Управление ucs в фоне
« Ответ #29 : 27-02-2014, 14:49:02 »
Хотел обрабатывать файл в фоне, без мельтешения. Пока приходится ради ucs пользоваться editor'ом.Но кроме всего прочего теперь уже действительно интересно
Второй пункт остается открытым, а по первому - если старше 2013 то можно не "мельтешить", а гнать через accoreconsole.exe.