Номер видового экрана. Почему меняется значение?

Автор Тема: Номер видового экрана. Почему меняется значение?  (Прочитано 12630 раз)

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Сегодня моя программа выдала ошибку "Необрабатываемое исключение..."  и т.д. Ошибку вызвала попытка назначить текущим видовой экран листа с номером -1. Цитата из справки:
Цитировать
Accesses the viewport ID number. This is the number that is reported by the AutoCAD CVPORT system variable when the viewport is the current viewport in the AutoCAD editor. If the viewport is inactive, -1 is returned.

This value is not saved with the drawing, and changes each time the drawing is opened.
То есть, была попытка назначить текущим "неактивный" видовой экран, я так понимаю, этот термин означает "выключенный", что подтвердили мои опыты с помощью такого кода:
Код - C# [Выбрать]
  1. [CommandMethod("TestVPNumber")]
  2.         public void RunTestVP()
  3.         {
  4.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  5.                 Editor ed = adoc.Editor;
  6.                 Database db = adoc.Database;
  7.  
  8.                 PromptEntityOptions selOpt = new PromptEntityOptions("\nSelect viewport:");
  9.                 selOpt.SetRejectMessage("This is not viewport!");
  10.                 selOpt.AddAllowedClass(typeof(Viewport), true);
  11.                 PromptEntityResult selRes = ed.GetEntity(selOpt);
  12.                 if (selRes.Status == PromptStatus.OK)
  13.                 {
  14.                     int number;
  15.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  16.                     {
  17.                         Viewport vp = tr.GetObject(selRes.ObjectId, OpenMode.ForRead) as Viewport;
  18.                         number = vp.Number;
  19.                         tr.Commit();
  20.                     }
  21.                     ed.WriteMessage("VP number is {0}", number);
  22.                 }
  23.         }
Но все видовые экраны в чертеже включены! Более того, в момент возникновения исключения, переменная, в которой был сохранен номер ВЭ имела значение -1, в то время как в свойствах самого ВЭ было значение 2.
В коде нигде состояния ВЭ не меняю. Причем, появляется эта ошибка нестабильно. На одном и том же чертеже с разницей в час она перестала появляться. AUDIT чертежа никаких ошибок не выявил.
Почему такое может быть?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Сколько видовых экранов на этом листе?
2. Какое значение системной переменной MAXACTVP?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
В одном чертеже на проблемной вкладке 3 ВЭ, в другом 4. MAXACTVP по умолчанию - 64 вроде. Да, точно:
Команда: MAXACTVP

Новое значение MAXACTVP <64>: *Прервано*
Перед манипуляциями с ВЭ было программное переключение на вкладку с этими ВЭ. Номер у ВЭ 2 - это значит, что это первый ВЭ вкладки. Может быть такое, что вкладка не успевает прогрузиться, поэтому при первом запросе номера имеем -1, а потом, во время второго запроса вкладка уже прогружена, потому выдает номер как полагается? Чертежи довольно объемные, переключение между вкладками вручную (с регенерацией) секунд 20-30 времени занимает на современном компьютере.
Пока что избавился от сохранения номера в переменной, просто запрашиваю его из свойства ВЭ - ошибка пропала. Но хотелось бы до конца разобраться с таким поведением.

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Цитировать
Чтобы разобраться нужен полный код, который достаточно стабильно приводит к этой ошибке и dwg-файл, на котором ты экспериментировал.
Боюсь, что это невозможно :( Я только код относящийся к этой программе буду из сборки полдня выдирать со всеми вспомогательными методами... А если я передам за пределы организации чертеж со всеми внешними - быстрыми ссылками и PDF подложками, меня не просто уволят, а еще, возможно, и посадят. С безопасностью у нас строго.
Цитировать
Вполне возможно. Особенно если если второй запрос номера происходит уже в другой команде AutoCAD.
Нет, все происходит в одной команде.
Тогда вопрос, можно ли как-нибудь программно "дождаться" полной регенерации видовых экранов вкладки?

С кодом получилось быстрее. Я убрал все что касается Civil 3D и не касается проблемы. Этот код также выдает исключение на тех чертежах.
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Runtime.InteropServices;
  6.  
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Runtime;
  11. using Autodesk.AutoCAD.Geometry;
  12.  
  13. using Autodesk.Windows;
  14.  
  15. namespace Test
  16. {
  17.     public class VPTest
  18.     {
  19.         [CommandMethod("ForVPTest", CommandFlags.NoBlockEditor)]
  20.         public void Run()
  21.         {
  22.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  23.             Database db = adoc.Database;
  24.             Editor ed = adoc.Editor;
  25.             // ID модели текущего чертежа
  26.             ObjectId mSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);          
  27.  
  28.             // Менеджер листов текущего документа
  29.             LayoutManager layoutMgr = LayoutManager.Current;
  30.  
  31.             //Коллекция ID листов документа
  32.             Dictionary<ObjectId, string> layouts = new Dictionary<ObjectId, string>();
  33.  
  34.             using (Transaction tr = db.TransactionManager.StartTransaction())
  35.             using (DBDictionary layoutDict = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary)
  36.             {
  37.                 foreach (DBDictionaryEntry dbDictEnt in layoutDict)
  38.                     if (dbDictEnt.Key != "Model") layouts.Add(dbDictEnt.Value, dbDictEnt.Key);
  39.                 tr.Commit();
  40.             }
  41.             string[] selLayouts = layouts.Values.ToArray();            
  42.            
  43.             if (selLayouts.Length > 0)
  44.             {
  45.                 // Запоминаем текущий лист
  46.                 string startLayout = layoutMgr.CurrentLayout;
  47.  
  48.                 #region Пробегаем по листам
  49.                 foreach (KeyValuePair<ObjectId, string> layout in layouts)
  50.                 {
  51.                     if (selLayouts.Contains(layout.Value))
  52.                     {
  53.                         //Устанавливаем текущим новый лист
  54.                         layoutMgr.CurrentLayout = layout.Value;
  55.                        
  56.                         // Обновляем вид приложения
  57.                         System.Windows.Forms.Application.DoEvents();
  58.  
  59.                         string curLayoutName = layout.Value;
  60.                         ObjectId curLayoutId = layout.Key;
  61.  
  62.                         using (Transaction tr = db.TransactionManager.StartTransaction())
  63.                         // Блок модели текущего чертежа
  64.                         using (BlockTableRecord mSpace = tr.GetObject(mSpaceId, OpenMode.ForWrite) as BlockTableRecord)
  65.                         // Таблица блоков текущего чертежа
  66.                         using (BlockTable blkTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable)
  67.                         using (DBDictionary layoutDict = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary)
  68.                         using (Layout curLay = tr.GetObject(curLayoutId, OpenMode.ForRead) as Layout)
  69.                         using (BlockTableRecord blkTabRec = tr.GetObject(curLay.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord)
  70.                         {
  71.                             // Проверяем наличие видовых экранов на листе
  72.  
  73.                             // Переменная для коллекции ID видовых экранов
  74.                             ObjectIdCollection vPortsIds = new ObjectIdCollection();
  75.                             // Получение коллекции видовых экранов на текущем листе
  76.                             vPortsIds = curLay.GetViewports();
  77.                             // Исключаем из коллекции главный видовой экран листа              
  78.                             vPortsIds.RemoveAt(0);
  79.  
  80.                             // Если есть ВЭ - ищем границы в модели
  81.                             if (vPortsIds.Count > 0)
  82.                             {
  83.                                 // Переключаемся в пространство листа
  84.                                 ed.SwitchToPaperSpace();
  85.  
  86.                                 // Сохраняем исходный вид
  87.                                 using (ViewTableRecord curLayoutView = ed.GetCurrentView())
  88.                                 {
  89.                                     // Проходим по видовым экранам в листе
  90.                                     foreach (ObjectId vPortId in vPortsIds)
  91.                                     {
  92.                                         // Получаем ссылку на объект ВЭ
  93.                                         Viewport viewport = tr.GetObject(vPortId, OpenMode.ForRead) as Viewport;
  94.  
  95.                                         // Коллекция объектов в текущем ВЭ
  96.                                         DBObjectCollection vpDbObjCol = new DBObjectCollection();
  97.  
  98.                                         // Номер текущего видового экрана
  99.                                         short vpNumber = (short)viewport.Number;
  100.  
  101.                                         // Границы области ВЭ
  102.                                         Extents3d vpExts;
  103.  
  104.                                         // Коллекция для точек видового экрана
  105.                                         Point3dCollection psVpPnts = new Point3dCollection();
  106.                                        
  107.                                         // Получаем границы его области
  108.                                         vpExts = viewport.GeometricExtents;
  109.  
  110.                                         #region Получаем координаты границы текущего ВЭ
  111.                                         // Если видовой экран стандартный прямоугольный
  112.                                         if (!viewport.NonRectClipOn)
  113.                                         {
  114.                                             // Получаем его точки
  115.                                             viewport.GetGripPoints(psVpPnts, new IntegerCollection(), new IntegerCollection());
  116.                                             // Выстраиваем точки в правильном порядке, по умолчанию они крест-накрест
  117.                                             Point3d tmp = psVpPnts[2];
  118.                                             psVpPnts[2] = psVpPnts[1];
  119.                                             psVpPnts[1] = tmp;                                            
  120.                                         }
  121.  
  122.                                         // Если видовой экран подрезанный - получаем примитив, по которому он подрезан
  123.                                         else
  124.                                         {
  125.                                             using (Entity ent = tr.GetObject(viewport.NonRectClipEntityId, OpenMode.ForRead) as Entity)
  126.                                             {
  127.                                                 //vpExts = ent.GeometricExtents;
  128.  
  129.                                                 // Если это полилиния - извлекаем ее точки
  130.                                                 if (ent is Polyline)
  131.                                                 {
  132.                                                     Polyline pline = ent as Polyline;                                                    
  133.                                                     for (int i = 0; i < pline.NumberOfVertices; i++) psVpPnts.Add(pline.GetPoint3dAt(i));
  134.                                                 }
  135.                                                 else if (ent is Polyline2d)
  136.                                                 {
  137.                                                     Polyline2d pline2d = ent as Polyline2d;
  138.                                                     foreach (ObjectId vertId in pline2d)
  139.                                                     {
  140.                                                         using (Vertex2d vert = tr.GetObject(vertId, OpenMode.ForRead) as Vertex2d)
  141.                                                         {
  142.                                                             if (!psVpPnts.Contains(vert.Position)) psVpPnts.Add(vert.Position);
  143.                                                         }
  144.                                                     }
  145.  
  146.                                                 }
  147.                                                 else if (ent is Curve)
  148.                                                 {
  149.                                                     Curve curve = ent as Curve;
  150.                                                     double
  151.                                                         startParam = curve.StartParam,
  152.                                                         endParam = curve.EndParam,
  153.                                                         delParam = (endParam - startParam) / 100;
  154.  
  155.                                                     for (double curParam = startParam; curParam < endParam; curParam += delParam)
  156.                                                     {
  157.                                                         Point3d curPt = curve.GetPointAtParameter(curParam);
  158.                                                         psVpPnts.Add(curPt);
  159.                                                         curParam += delParam;
  160.                                                     }
  161.                                                 }
  162.                                                 else
  163.                                                 {
  164.                                                     Application.ShowAlertDialog("Видовой экран подрезан необрабатываемым объектом!"
  165.                                                         + string.Format("\nЛист: {0}, видовой экран №{1}, объект подрезки: {2}\n", curLayoutName, vpNumber, ent.ToString()));
  166.                                                 }
  167.                                             }
  168.                                         }
  169.  
  170.                                         #endregion Получаем координаты границы текущего ВЭ
  171.  
  172.                                         #region Переводим в модель граничные точки текущего ВЭ
  173.  
  174.                                         // Зуммируем ВЭ
  175.                                         ed.ZoomWin(vpExts);
  176.  
  177.                                         // Обновляем вид
  178.                                         ed.UpdateScreen();
  179.  
  180.                                         // Переходим внутрь активного ВЭ
  181.                                         ed.SwitchToModelSpace();
  182.  
  183.                                         // Проверяем состояние ВЭ
  184.                                         if (viewport.Number > 0)
  185.                                         {
  186.                                             // Переключаемся в обрабатываемый ВЭ                                            
  187.                                             Application.SetSystemVariable("CVPORT", vpNumber);
  188.  
  189.                                             // Преобразование точки из PS в MS
  190.                                             ResultBuffer rbPSDCS = new ResultBuffer(new TypedValue(5003, 3));
  191.                                             ResultBuffer rbDCS = new ResultBuffer(new TypedValue(5003, 2));
  192.                                             ResultBuffer rbWCS = new ResultBuffer(new TypedValue(5003, 0));
  193.                                             double[] retPoint = new double[] { 0, 0, 0 };
  194.                                             // loop the ps points
  195.                                             Point3dCollection msVpPnts = new Point3dCollection();
  196.                                             Point2dCollection msVpPnts2d = new Point2dCollection();
  197.  
  198.                                             foreach (Point3d pnt in psVpPnts)
  199.                                             {
  200.                                                 // преобразуем из DCS пространства Листа (PSDCS) RTSHORT=3
  201.                                                 // в DCS пространства Модели текущего Видового Экрана RTSHORT=2
  202.                                                 Support.acedTrans(pnt.ToArray(), rbPSDCS.UnmanagedObject, rbDCS.UnmanagedObject, 0, retPoint);
  203.                                                 // Преобразуем из DCS пространства Модели текущего Видового Экрана RTSHORT=2
  204.                                                 // в WCS RTSHORT=0
  205.                                                 Support.acedTrans(retPoint, rbDCS.UnmanagedObject, rbWCS.UnmanagedObject, 0, retPoint);
  206.                                                 // Добавляем точку в коллекцию
  207.                                                 Point3d newPt = new Point3d(retPoint);
  208.                                                 if (!msVpPnts.Contains(newPt)) msVpPnts.Add(newPt);
  209.                                                 Point2d newPt2d = newPt.ConvertTo2D();
  210.                                                 msVpPnts2d.Add(newPt2d);
  211.                                             }
  212.  
  213.                                         #endregion Переводим в модель граничные точки текущего ВЭ                                          
  214.  
  215.                                         }
  216.                                         // Переключаемся в лист
  217.                                         ed.SwitchToPaperSpace();
  218.                                     }
  219.                                     ed.SetCurrentView(curLayoutView);
  220.                                 }
  221.                                
  222.                             }
  223.                             tr.Commit();
  224.                         }
  225.                     }
  226.                 }
  227.                 #endregion
  228.                 layoutMgr.CurrentLayout = startLayout;
  229.             }            
  230.         }
  231.     }
  232.  
  233.     static class Support
  234.     {
  235.         /// <summary>
  236.         /// http://through-the-interface.typepad.com/through_the_interface/2008/06/zooming-to-a-wi.html
  237.         /// </summary>
  238.         /// <param name="ed">Редактор документа</param>
  239.         /// <param name="min">Первая точка ограничивающей рамки</param>
  240.         /// <param name="max">Вторая точка ограничивающей рамки</param>
  241.         public static void ZoomWin(this Editor ed, Point3d min, Point3d max)
  242.         {
  243.             Point2d min2d = new Point2d(min.X, min.Y);
  244.             Point2d max2d = new Point2d(max.X, max.Y);
  245.  
  246.             ViewTableRecord view = (ViewTableRecord)ed.GetCurrentView().Clone();
  247.  
  248.             view.CenterPoint = min2d + ((max2d - min2d) / 2.0);
  249.             view.Height = max2d.Y - min2d.Y;
  250.             view.Width = max2d.X - min2d.X;
  251.  
  252.             ed.SetCurrentView(view);
  253.         }
  254.  
  255.         public static void ZoomWin(this Editor ed, Extents3d ext3d)
  256.         {
  257.             ed.ZoomWin(ext3d.MinPoint, ext3d.MaxPoint);
  258.         }
  259.  
  260.         /// <summary>
  261.         /// http://adndevblog.typepad.com/autocad/2013/page/41/
  262.         /// </summary>
  263.         /// <param name="point">Точки на листе</param>
  264.         /// <param name="fromRb">Система координат "ИЗ"</param>
  265.         /// <param name="toRb">Система координат "В"</param>
  266.         /// <param name="disp"></param>
  267.         /// <param name="result"></param>
  268.         /// <returns></returns>
  269.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
  270.         public static extern int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
  271.  
  272.         /// <summary>
  273.         /// Преобразование 3Д точки в 2Д путем отсекания координаты Z.
  274.         /// </summary>
  275.         /// <param name="point3d">3Д точка</param>
  276.         /// <returns>2Д точка</returns>
  277.         public static Point2d ConvertTo2D(this Point3d point3d)
  278.         {
  279.             return new Point2d(point3d.X, point3d.Y);
  280.         }
  281.     }
  282. }
  283.  
« Последнее редактирование: 04-02-2014, 16:49:54 от Загорулькин Дмитрий »

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Получилось сделать файл, на котором вываливается ошибка.
Пардон, был невнимателен... В коде забыл присвоить переменной с номером ВЭ значение.
Код в предыдущем сообщении поправил, проверил - ошибка выскакивает.
« Последнее редактирование: 04-02-2014, 17:19:40 от Загорулькин Дмитрий »

Отмечено как Решение Дмитрий Загорулькин 08-10-2014, 14:48:45

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я закоментировал ed.ZoomWin(vpExts); и исключение пропало. Вообще-то (IMHO) операции типа:
  • ed.ZoomWin(vpExts);
  • ed.SwitchToModelSpace();
  • Application.SetSystemVariable("CVPORT", vpNumber);
  • ed.SwitchToPaperSpace();
  • ed.SetCurrentView(curLayoutView);
нужно делать вне транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вообще-то (IMHO) операции типа:
...
нужно делать вне транзакции.
?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
?
Будем считать, что это интуиция...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я закоментировал ed.ZoomWin(vpExts); и исключение пропало.
Почему так? Зуммирование выполняется отдельным потоком (или как это еще назвать?), параллельно с выполнением кода?
Вообще-то (IMHO) операции типа:
ed.ZoomWin(vpExts);
ed.SwitchToModelSpace();
Application.SetSystemVariable("CVPORT", vpNumber);
ed.SwitchToPaperSpace();
ed.SetCurrentView(curLayoutView);
нужно делать вне транзакции.
Вынести эти операции за транзакцию можно, путем ее "разрыва". Перед ними закончить, после них снова начать. Доверюсь Вашей интуиции :)

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Почему так? Зуммирование выполняется отдельным потоком (или как это еще назвать?), параллельно с выполнением кода?
Немного оффтопа - механизм того что называют почему-то "транзакцией" в автокаде (в ракурсе информатики - это, то что должно быть или выполненно не взирая на "внешние" действие полностью, либо не произвести вообще никакого эффекта - а в моем представлении падение системы это не слабый эффект) - это единственное, из встречающегося мне современного, что до боли напоминает программирование под дос (чуть что - сразу фатал), ладно, я могу еще согласится, что подобные вещи могут всплывать на уровне ARX, но когда, на виртуальной машине, к одному классу, не могут обратиться, даже не паралельно, а просто "вложенно" друг в друга не то что два процесса, а просто две "подпрограммы"  далее идет непереводимая игра слов с использованием местных идиоматических выражений.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вынести эти операции за транзакцию можно, путем ее "разрыва".
или же просто заменить
Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
на
Код - C# [Выбрать]
  1. using (OpenCloseTransaction tr = db.TransactionManager.StartOpenCloseTransaction())

UPD Подробнее на тему работы с базой данных чертежа посредством транзакции и без неё - здесь.
« Последнее редактирование: 05-02-2014, 15:32:30 от Андрей Бушман »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Андрей Бушман. "Практика - критерий истины". В данном случае замена Transaction на OpenCloseTransaction не помогает. Возникает тоже самое исключение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Андрей Бушман. "Практика - критерий истины". В данном случае замена Transaction на OpenCloseTransaction не помогает. Возникает тоже самое исключение.
А почему не зелёненьким?

Моё предыдущее сообщение было о том, что код, работающий в контексте транзакции, легко и быстро можно перевести в режим ЭМУЛЯЦИИ транзакции, путём замены всего лишь одной строки кода. О том, что проблемная строка кода (закомментированная вами) заработает я не писал.

P.S. А ещё OpenCloseTransaction наследуется от Transaction, что позволяет режим эмуляции записывать так:
Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Попробовал режим эмуляции. На первый взгляд ничего не изменилось, оставил эмуляцию и продолжил вносить изменения в код... После ...дцатого изменения заметил, что программа работает некорректно. На поиски причины потратил кучу времени и нервов. В итоге, выяснилось, что при эмуляции транзакции не работает метод Explode :(

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В итоге, выяснилось, что при эмуляции транзакции не работает метод Explode :(
Очень странно. Думаю, что всё-таки это ошибка в твоем коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Это как? Если я одно на другое заменил - все работать стало снова.
У меня вчера чуть дым из ушей не пошел, когда я пытался понять, почему метод Explode выдает пустую коллекцию объектов. При том, что расчленяемый объект определен верно, он не пустой, он существует, его свойства меняются программно, его можно выделить, подсветить, зуммировать...
Исправил StartOpenCloseTransaction() на StartTransaction() - все стало в порядке.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Транзакции позволяют большие "вольности", чем Open/Close. Так что нужно видеть код, чтобы понять что "не так".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я для себя уже определил что не так :) Нафик-нафик такие недотранзакции... Экспериментировать с ними пока некогда и нет надобности.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не буду уговаривать, но это как лакмусовая бумажка, которая говорит, что у тебя в коде не всё в порядке и может "выстрелить" в любой момент.
И еще одно замечание (почти божественное  ::) ): "Сначала было Open/Close, а потом (для ленивых) сделали транзакции".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение