Fatal error при зеркалировании текста

Автор Тема: Fatal error при зеркалировании текста  (Прочитано 4246 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Столкнулся с ситуацией, когда при зеркалировании MText Autocad вылетает с fatal error. Код компилируется без ошибок, предупреждений тоже нет. Почему так происходит? Как можно отзеркалить текст?
Код - C# [Выбрать]
  1.  public static void DrawSectionLines(string sectionName, int scale = 200)
  2.         {
  3.             Point3d firstPoint = SelectionUtilities.GetPointFromUser("Pick first section line point");
  4.             Point3d secondPoint = SelectionUtilities.GetPointFromUser("Pick second section line point");
  5.             Point3d desiredSidePointer = SelectionUtilities.GetPointFromUser("Specify desired side");
  6.  
  7.             double stripeThickness = 0.5 * scale;
  8.             int stripeLength = 5 * scale;
  9.             //--------------------------------------------------------------------Mandatory variables
  10.             Document doc = Application.DocumentManager.MdiActiveDocument;
  11.             Database db = doc.Database;
  12.             Editor ed = doc.Editor;
  13.             Transaction tr = db.TransactionManager.StartTransaction();
  14.             //--------------------------------------------------------------------Mandatory variables
  15.  
  16.             using (tr)
  17.             {
  18.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  19.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  20.  
  21.                 Polyline polyline = new Polyline();
  22.                 polyline.SetDatabaseDefaults();
  23.                 polyline.AddVertexAt(0, new Point2d(firstPoint.X, firstPoint.Y), 0, stripeThickness, stripeThickness);
  24.                 polyline.AddVertexAt(1, new Point2d(firstPoint.X - 5 * scale, firstPoint.Y), 0, stripeThickness, stripeThickness);
  25.  
  26.                 polyline.LineWeight = LineWeight.LineWeight060;
  27.                 polyline.Layer = "0";
  28.                 btr.AppendEntity(polyline);
  29.                 tr.AddNewlyCreatedDBObject(polyline, true);
  30.  
  31.                 Polyline arrow = new Polyline();
  32.                 arrow.SetDatabaseDefaults();
  33.                 arrow.AddVertexAt(0, new Point2d(firstPoint.X - 0.66 * stripeLength, firstPoint.Y - 0.33), 0, 0, stripeThickness * 3);
  34.                 arrow.AddVertexAt(1, new Point2d(firstPoint.X - 0.66 * stripeLength, firstPoint.Y - 0.33 * stripeLength), 0, 0, 0);
  35.                 arrow.AddVertexAt(2, new Point2d(firstPoint.X - 0.66 * stripeLength, firstPoint.Y - stripeLength * 1.2), 0, 0, 0);
  36.  
  37.                 arrow.LineWeight = LineWeight.LineWeight060;
  38.                 arrow.Layer = "0";
  39.                 btr.AppendEntity(arrow);
  40.                 tr.AddNewlyCreatedDBObject(arrow, true);
  41.                 MText mtext = new MText();
  42.                 using (mtext)
  43.                 {
  44.                     mtext.Location = arrow.EndPoint;
  45.                     mtext.TextHeight = ESKDValues.SectionTextHeight * scale;
  46.                     mtext.Attachment = AttachmentPoint.BottomRight;
  47.                     mtext.Contents = sectionName;
  48.                     mtext.Layer = "0";
  49.  
  50.                     btr.AppendEntity(mtext);
  51.                     tr.AddNewlyCreatedDBObject(mtext, true);
  52.                 }
  53.  
  54.  
  55.  
  56.                 Polyline mirroredPolyline = (Polyline)polyline.Clone();
  57.                 Polyline mirroredArrow = (Polyline)arrow.Clone();
  58.                 MText mirroredMText = (MText)mtext.Clone();
  59.  
  60.                 Line auxLine = new Line(firstPoint, secondPoint);
  61.                 Point3d mlFirstPoint3D = new Point3d((firstPoint.X + secondPoint.X) / 2, 10, 0);
  62.                 Point3d mlSecondPoint3D = new Point3d((firstPoint.X + secondPoint.X) / 2, -10, 0);
  63.                 Line3d mirrorLine = new Line3d(mlFirstPoint3D, mlSecondPoint3D);
  64.  
  65.                 mirroredPolyline.TransformBy(Matrix3d.Mirroring(mirrorLine));
  66.                 btr.AppendEntity(mirroredPolyline);
  67.                 tr.AddNewlyCreatedDBObject(mirroredPolyline, true);
  68.  
  69.  
  70.                 mirroredArrow.TransformBy(Matrix3d.Mirroring(mirrorLine));
  71.                 btr.AppendEntity(mirroredArrow);
  72.                 tr.AddNewlyCreatedDBObject(mirroredArrow, true);
  73.  
  74.                 mirroredMText.TransformBy(Matrix3d.Mirroring(mirrorLine));
  75.                 btr.AppendEntity(mirroredMText);
  76.                 tr.AddNewlyCreatedDBObject(mirroredMText, true);
  77.  
  78.  
  79.  
  80.  
  81.                 tr.Commit();
  82.             }
  83.         }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Fatal error при зеркалировании текста
« Ответ #1 : 12-01-2019, 23:57:03 »
Во-первых - оберните в try{}catch{} и ловите ошибку
Во-вторых - using вызывает Dispose
В-третьих - чтобы объект добавился в базу, нужно закоммитить транзакцию, а потом уже делать копию
В четвертых - чтобы менять примитив нужно его сначала открыть на запись

Начните с п.1

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при зеркалировании текста
« Ответ #2 : 13-01-2019, 00:46:36 »
Во-первых - оберните в try{}catch{} и ловите ошибку
Ошибка происходит именно при попытке копирования текста через Clone.
В-третьих - чтобы объект добавился в базу, нужно закоммитить транзакцию, а потом уже делать копию
А почему тогда полилинии не вызывают fatal error ? Я же создаю все объекты однотипно.

Отмечено как Решение Александр Ривилис 13-01-2019, 01:22:16

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Fatal error при зеркалировании текста
« Ответ #3 : 13-01-2019, 00:51:34 »
А почему тогда полилинии не вызывают fatal error ? Я же создаю все объекты однотипно.
Потому-что есть еще п.2 про using - вы пытаетесь клонировать объект у которого вызвали Dispose

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при зеркалировании текста
« Ответ #4 : 13-01-2019, 00:52:40 »
Ошибка происходит именно при попытке копирования текста через Clone.
Цитата: Александр Пекшев aka Modis от 12-01-2019, 22:57:03

    В-третьих - чтобы объект добавился в базу, нужно закоммитить транзакцию, а потом уже делать копию

А почему тогда полилинии не вызывают fatal error ? Я же создаю все объекты однотипно.
Причина в:
Код - C# [Выбрать]
  1. using (mtext)
  2. {
  3. ...
  4. }
  5.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при зеркалировании текста
« Ответ #5 : 13-01-2019, 01:20:41 »
using (mtext)
Я понял причину. Но тогда почему Autodesk в руководстве по разработке рекомендует создавать MText оборачивая его в using? Как понять когда using нужен, а когда нет?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при зеркалировании текста
« Ответ #6 : 13-01-2019, 01:21:43 »
Но тогда почему Autodesk в руководстве по разработке рекомендует создавать MText оборачивая его в using?
Где? Ссылку пожалуйста на это.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при зеркалировании текста
« Ответ #7 : 13-01-2019, 01:24:29 »
Где? Ссылку пожалуйста на это.



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при зеркалировании текста
« Ответ #8 : 13-01-2019, 01:28:37 »
1. Это написана глупость. Такое бывает и в документации.
2. В том контексте она не приводит к Fatal Error, потому что после блока using объект созданный в нём не используется. Ты же попытался его использовать, что и привело к Fatal Error.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при зеркалировании текста
« Ответ #9 : 13-01-2019, 01:31:05 »
Понял. Спасибо.