Штриховка и OpenCloseTransaction

Автор Тема: Штриховка и OpenCloseTransaction  (Прочитано 8983 раз)

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Штриховка и OpenCloseTransaction
« : 03-01-2018, 17:52:37 »
Пришло время рисовать штриховку и выяснилось, что не рисуется она. Взял пример http://adndevblog.typepad.com/autocad/2012/07/hatch-using-the-autocad-net-api.html - работает. Перенес в свой проект - не работает. Долго разбирался и понял, что все дело в транзакции. Если использовать:
Код - C# [Выбрать]
  1. Transaction Tx = db.TransactionManager.StartTransaction()
то работает, а вот если так:
Код - C# [Выбрать]
  1. OpenCloseTransaction Tx = db.TransactionManager.StartOpenCloseTransaction()

Вот полный код неработающего примера:
Код - C# [Выбрать]
  1.         [CommandMethod("testHatch")]
  2.         static public void testHatch()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.  
  8.             using (OpenCloseTransaction Tx = db.TransactionManager.StartOpenCloseTransaction())
  9.             {
  10.                 ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
  11.  
  12.                 BlockTableRecord btr = Tx.GetObject(ModelSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  13.  
  14.                 Polyline plBox = new Polyline();
  15.                 plBox.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
  16.                 plBox.AddVertexAt(1, new Point2d(0, 10), 0, 0, 0);
  17.                 plBox.AddVertexAt(2, new Point2d(20, 10), 0, 0, 0);
  18.                 plBox.AddVertexAt(3, new Point2d(20, 0), 0, 0, 0);
  19.                 plBox.Closed = true;
  20.  
  21.                 ObjectId pLineId;
  22.                 pLineId = btr.AppendEntity(plBox);
  23.                 Tx.AddNewlyCreatedDBObject(plBox, true);
  24.  
  25.                 ObjectIdCollection ObjIds = new ObjectIdCollection();
  26.                 ObjIds.Add(pLineId);
  27.  
  28.                 Hatch oHatch = new Hatch();
  29.                 oHatch.Elevation = 0.0;
  30.                 oHatch.PatternScale = 2.0;
  31.                 oHatch.SetHatchPattern(HatchPatternType.PreDefined, "ZIGZAG");
  32.                 oHatch.ColorIndex = 1;
  33.  
  34.                 btr.AppendEntity(oHatch);
  35.                 Tx.AddNewlyCreatedDBObject(oHatch, true);
  36.  
  37.                 oHatch.Associative = true;
  38.                 oHatch.AppendLoop((int)HatchLoopTypes.Default, ObjIds);
  39.                 oHatch.EvaluateHatch(true);
  40.  
  41.                 Tx.Commit();
  42.             }
  43.         }

И вот такая ошибка вылезает:


Это что же такое происходит, товарищи: создание штриховки с заданием контура в виде полилинии не работает при StartOpenCloseTransaction()?

Отмечено как Решение Алексей Терно 04-01-2018, 01:15:04

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Штриховка и OpenCloseTransaction
« Ответ #1 : 03-01-2018, 17:59:30 »
А потому что транзакции допускают вольное обращение с открытыми объектами, а эмуляция транзакции - нет. Чтобы гарантировать правильную работу с объектами, сделай, например, создание полилинии в отдельной OpenCloseTransaction

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #2 : 03-01-2018, 18:04:18 »
А потому что транзакции допускают вольное обращение с открытыми объектами, а эмуляция транзакции - нет.
В чем же вольность при использовании Id полилинии в качестве контура полилинии?

сделай, например, создание полилинии в отдельной OpenCloseTransaction
Наверное, проще создать штриховку в отдельной StartTransaction

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Штриховка и OpenCloseTransaction
« Ответ #3 : 03-01-2018, 18:38:28 »
Ну в данном случае полилиния только-только создана, ещё даже не закрыта после создания. А её уже по id передаёшь в метод для другого объекта. Это нехорошо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Штриховка и OpenCloseTransaction
« Ответ #4 : 03-01-2018, 20:11:10 »
Алексей Терно
Дмитрий Загорулькин абсолютно прав. Вставь в 27 (80 в твоём коде на картинке)  строку:
Код - C# [Выбрать]
  1. plBox.Close();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #5 : 04-01-2018, 01:14:50 »
Выбор пал на создание вложенной транзакции для создания полилинии.

Спасибо за участие!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Штриховка и OpenCloseTransaction
« Ответ #6 : 04-01-2018, 01:17:23 »
Выбор пал на создание вложенной транзакции для создания полилинии.

Спасибо за участие!
Если ты смешаешь OpenCloseTransaction и обычную Transaction, то в конечном итоге это закончится печально. Так что имей в виду. Да и увлекаться вложенными транзакциями я бы не стал. А уж с OpenCloseTransaction и подавно. В отличие от обычных транзакций повторно можно открывать только открытый для чтения объект, но никак иначе...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #7 : 04-01-2018, 01:22:24 »
Выбор пал на создание вложенной транзакции для создания полилинии.

Спасибо за участие!
Если ты смешаешь OpenCloseTransaction и обычную Transaction, то в конечном итоге это закончится печально. Так что имей в виду. Да и увлекаться вложенными транзакциями я бы не стал. А уж с OpenCloseTransaction и подавно. В отличие от обычных транзакций повторно можно открывать только открытый для чтения объект, но никак иначе...

Тогда возвращаюсь к обычной транзакции - с ней все (по крайней мере в этом проекте) все работает без дополнительных проблем.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Штриховка и OpenCloseTransaction
« Ответ #8 : 04-01-2018, 01:25:37 »
Тогда возвращаюсь к обычной транзакции - с ней все (по крайней мере в этом проекте) все работает без дополнительных проблем.
Дмитрий Загорулькин  имел в виду не вложенную транзакцию, а последовательно две транзакции. В первой создаём полилинию (или полилинии) - контур штриховки. И на этом первая транзакция завершается. Во второй создаём саму штриховку. Так будет работать идеально в любом случае.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #9 : 04-01-2018, 01:39:22 »
Тогда возвращаюсь к обычной транзакции - с ней все (по крайней мере в этом проекте) все работает без дополнительных проблем.
Дмитрий Загорулькин  имел в виду не вложенную транзакцию, а последовательно две транзакции. В первой создаём полилинию (или полилинии) - контур штриховки. И на этом первая транзакция завершается. Во второй создаём саму штриховку. Так будет работать идеально в любом случае.

Я так делал года три назад, когда добавлял к штриховке внутренние контуры скрытия, и тогда была обычная транзакция ))

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #10 : 04-01-2018, 01:51:51 »
Александр, а давайте немного углубимся в историю вопроса: все началось с того, что при создании штриховки по точкам, а не по контуру, она изначально создается некорректно - половина линий не видно и при задании угла поворота часть штриховки пропадает, но достаточно вручную изменить геометрию штриховки, как она принимает правильный вид:


Вот измененная часть кода:
Код - C# [Выбрать]
  1. Point2dCollection pnts = new Point2dCollection();
  2. pnts.Add(new Point2d(0, 0));
  3. pnts.Add(new Point2d(0, 10));
  4. pnts.Add(new Point2d(20, 10));
  5. pnts.Add(new Point2d(20, 0));
  6.  
  7. DoubleCollection dbls = new DoubleCollection();
  8. dbls.Add(0);
  9. dbls.Add(0);
  10. dbls.Add(0);
  11. dbls.Add(0);
  12.  
  13. oHatch.AppendLoop((int)HatchLoopTypes.Default, pnts, dbls);
  14. oHatch.EvaluateHatch(true);

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Штриховка и OpenCloseTransaction
« Ответ #11 : 04-01-2018, 01:56:14 »
А вопрос то в чем?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #12 : 04-01-2018, 01:58:24 »
А вопрос то в чем?

Почему так происходит? Это особенность автокада или надо со штриховкой производить дополнительные манипуляции, чтобы на создавалась нормальная?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Штриховка и OpenCloseTransaction
« Ответ #13 : 04-01-2018, 02:00:36 »
А вопрос то в чем?

Почему так происходит? Это особенность автокада или надо со штриховкой производить дополнительные манипуляции, чтобы на создавалась нормальная?
Что-то мне подсказывает, что точки ты задал неправильно - нет у тебя замыкающей точки. Посмотри этот пример: http://adn-cis.org/forum/index.php?topic=7368.msg22780#msg22780
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Штриховка и OpenCloseTransaction
« Ответ #14 : 04-01-2018, 02:04:18 »
Что-то мне подсказывает, что точки ты задал неправильно - нет у тебя замыкающей точки. Посмотри этот пример: http://adn-cis.org/forum/index.php?topic=7368.msg22780#msg22780
Точно!!! Вот что я забыл - добавить последнюю точку! Я же знаю про эту особенность ))
Спасибо!