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

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

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

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Управление ucs в фоне
« : 26-02-2014, 10:07:07 »
При отрытии БД чертежа через Database.ReadDwgFile не получается сбросить UCS модели в WCS.
Код - C# [Выбрать]
  1. Database db= new Database(false, true);
  2. db.ReadDwgFile(path, System.IO.FileShare.ReadWrite, true, null);
  3. using (Transaction tr = db.TransactionManager.StartTransaction())
  4. {
  5.         ViewportTable vt = (ViewportTable)tr.GetObject(db.ViewportTableId, OpenMode.ForRead);
  6.         ViewportTableRecord vtr = (ViewportTableRecord)tr.GetObject(vt["*Active"], OpenMode.ForWrite);
  7.         vtr.SetUcsToWorld();
  8.         tr.Commit();
  9. }
Кстати, не получается даже если пытаться так сделать в текущем документе.
Алексей

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #1 : 26-02-2014, 10:33:46 »
Код - C# [Выбрать]
  1. db.SaveAs(path, Db.DwgVersion.Current);
:)

AutoCAD 2014 SP1. Система координат успешно установилась в WCS. Курсор - вот он действительно остался ориентированным по предыдущей, пользовательской системе координат (я устанавливал по объекту, развёрнутой на некоторый угол).

UPD

Хотя стоп... После отработки указанного выше кода, автокад показывает пиктограмму так, как будто установлена WCS, но если попытаться начертить полилинию, задав в качестве начальной точки 0,0, то получаем это (проверял в 2009-м SP3 и 2014-м SP1):



Т.е. несоответствие отображаемой пиктограммы текущей системе координат.
« Последнее редактирование: 26-02-2014, 11:17:50 от Андрей Бушман »

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Управление ucs в фоне
« Ответ #2 : 26-02-2014, 10:40:24 »
Андрей Бушман, SaveAs делается, конечно ))
ыыыыыыы. А теперь сработало! Чего я забыл до этого прописать - история умалчивает...
« Последнее редактирование: 26-02-2014, 15:11:49 от bargool »
Алексей

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #3 : 26-02-2014, 10:43:22 »
посмотри выше мой UPD.

Вместо "*Active" лучше используй
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices.ViewportActiveName

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Управление ucs в фоне
« Ответ #4 : 26-02-2014, 10:56:40 »
за ViewportActiveName спасибо.
Апдейт подтверждаю. иконка UCS делает вид, что она WCS, но по факту UCS остается на месте (кстати, один раз было всё нормально, а несколько раз даже иконка никуда не сдвигалась - теперь, правда не повторить)
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #5 : 26-02-2014, 16:16:43 »
Думаю что тут еще играет роль UCSFOLLOW.
И еще. Изменения в ViewportTableRecord напрямую не отражаются в редакторе. Стоит еще и установить Editor.CurrentUserCoordinateSystem в WCS
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #6 : 26-02-2014, 16:21:34 »
Стоит еще и установить Editor.CurrentUserCoordinateSystem в WCS
И как же он это сделает, если редактирует Database не создавая при этом Document?
Думаю, что пара-тройка строчек кода, демонстрирующих решение обозначенной проблемы, вполне бы устроили "отца Российской Демократии" (с) ;)

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Управление ucs в фоне
« Ответ #7 : 26-02-2014, 16:23:29 »
Александр, дело в том, что я открываю этот файл с помощью Database.ReadDwgFile, документа у меня нет, ведь так?
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #8 : 26-02-2014, 16:24:01 »
И как же он это сделает, если редактирует Database не создавая при этом Document?
Ага. Интересный вопрос. Тогда и vt["*Active"] неправильно, так оно имеет такое имя только в редакторе AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #9 : 26-02-2014, 16:25:09 »
Александр, дело в том, что я открываю этот файл с помощью Database.ReadDwgFile, документа у меня нет, ведь так?
Объясни зачем ты меняешь систему координат. Может можно обойтись другими средствами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #10 : 26-02-2014, 16:25:58 »
Тогда и vt["*Active"] неправильно, так оно имеет такое имя только в редакторе AutoCAD.
В отладчике показывается именно оно. Кроме того, на всякий случай, я выше рекомендовал использовать
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices.ViewportActiveName

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #11 : 26-02-2014, 16:26:37 »
Может можно обойтись другими средствами.
А если нельзя? Предположим, что нужно программно систему координат, для некоторого видового экрана, установить в WCS. :) Можно и перефразировать вопрос, задав его, что называется в лоб: почему SetUcsToWorld не работает должным образом? Если для корректной работы обозначенного метода требуется подправить код, то какие именно правки нужны?

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #12 : 26-02-2014, 16:57:15 »
Я тестировал так:
Код - 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 App = 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.                         const String path = @"C:\test\test.dwg"; // Предполагается, что DWG присутствует
  21.                         Db.Database prevDb = Db.HostApplicationServices.WorkingDatabase;
  22.                         Db.Database db = new Db.Database(false, true);
  23.                         db.ReadDwgFile(path, System.IO.FileShare.ReadWrite, true, null);
  24.                         db.CloseInput(true); // Пробовал и без этой строки, но результат тот же
  25.                         Db.HostApplicationServices.WorkingDatabase = db;
  26.                         using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  27.                                 Db.ViewportTable vt = (Db.ViewportTable)tr.GetObject(db.ViewportTableId,
  28.                                         Db.OpenMode.ForRead);
  29.                                 Db.ViewportTableRecord vtr = (Db.ViewportTableRecord)tr.GetObject(
  30.                                         vt[Db.SymbolUtilityServices.ViewportActiveName], Db.OpenMode.ForWrite);
  31.  
  32.                                 vtr.UcsFollowMode = true; // допустим, пусть разворачивает вид параллельно UCS  (хотя мне это и не надо)
  33.                                 vtr.SetUcsToWorld(); // не сработало: не назначена WCS
  34.                                 vtr.SetViewDirection(Db.OrthographicView.TopView); // пробовал даже так                                                 
  35.  
  36.                                 tr.Commit();
  37.                         }
  38.                         Db.HostApplicationServices.WorkingDatabase = prevDb;
  39.                         db.SaveAs(path, Db.DwgVersion.Current);
  40.                 }
  41.         }
  42. }
« Последнее редактирование: 26-02-2014, 17:30:45 от Андрей Бушман »

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Управление ucs в фоне
« Ответ #13 : 26-02-2014, 17:11:10 »
Думаю что тут еще играет роль UCSFOLLOW.
Хотелось бы обойтись без этого, тем более, что в данном случае оно не срабатывает.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Управление ucs в фоне
« Ответ #14 : 26-02-2014, 19:03:23 »
В действительности vtr.SetUcsToWorld(); устанавливает WCS в качестве системы координат для вида, но не устанавливает её текущей для чертежа. Все методы для установки UCS для Database (кроме Database.UcsBase) read-only. В ObjectARX ситуация таже. Есть недокументированный класс AcDbHeader, в котором есть методы setUcsXXX, и которые похоже используются внутри AutoCAD для установки системы координат при запуске команды _UCS.
Я задал вопрос в ADN DevHelp возможно ли вообще установить текущей системой координат WCS для чертежа, который не открыт в редакторе AutoCAD. Подождем ответа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение