Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 03-01-2018, 17:52:37

Название: Штриховка и 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.         }

И вот такая ошибка вылезает:
(https://s18.postimg.org/lwdz3gnnt/2018-01-03_17-47-11.png)

Это что же такое происходит, товарищи: создание штриховки с заданием контура в виде полилинии не работает при StartOpenCloseTransaction()?
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Дмитрий Загорулькин от 03-01-2018, 17:59:30
А потому что транзакции допускают вольное обращение с открытыми объектами, а эмуляция транзакции - нет. Чтобы гарантировать правильную работу с объектами, сделай, например, создание полилинии в отдельной OpenCloseTransaction
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 03-01-2018, 18:04:18
А потому что транзакции допускают вольное обращение с открытыми объектами, а эмуляция транзакции - нет.
В чем же вольность при использовании Id полилинии в качестве контура полилинии?

сделай, например, создание полилинии в отдельной OpenCloseTransaction
Наверное, проще создать штриховку в отдельной StartTransaction
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Дмитрий Загорулькин от 03-01-2018, 18:38:28
Ну в данном случае полилиния только-только создана, ещё даже не закрыта после создания. А её уже по id передаёшь в метод для другого объекта. Это нехорошо.
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Александр Ривилис от 03-01-2018, 20:11:10
Алексей Терно
Дмитрий Загорулькин абсолютно прав. Вставь в 27 (80 в твоём коде на картинке)  строку:
Код - C# [Выбрать]
  1. plBox.Close();
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 04-01-2018, 01:14:50
Выбор пал на создание вложенной транзакции для создания полилинии.

Спасибо за участие!
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Александр Ривилис от 04-01-2018, 01:17:23
Выбор пал на создание вложенной транзакции для создания полилинии.

Спасибо за участие!
Если ты смешаешь OpenCloseTransaction и обычную Transaction, то в конечном итоге это закончится печально. Так что имей в виду. Да и увлекаться вложенными транзакциями я бы не стал. А уж с OpenCloseTransaction и подавно. В отличие от обычных транзакций повторно можно открывать только открытый для чтения объект, но никак иначе...
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 04-01-2018, 01:22:24
Выбор пал на создание вложенной транзакции для создания полилинии.

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

Тогда возвращаюсь к обычной транзакции - с ней все (по крайней мере в этом проекте) все работает без дополнительных проблем.
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Александр Ривилис от 04-01-2018, 01:25:37
Тогда возвращаюсь к обычной транзакции - с ней все (по крайней мере в этом проекте) все работает без дополнительных проблем.
Дмитрий Загорулькин  имел в виду не вложенную транзакцию, а последовательно две транзакции. В первой создаём полилинию (или полилинии) - контур штриховки. И на этом первая транзакция завершается. Во второй создаём саму штриховку. Так будет работать идеально в любом случае.
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 04-01-2018, 01:39:22
Тогда возвращаюсь к обычной транзакции - с ней все (по крайней мере в этом проекте) все работает без дополнительных проблем.
Дмитрий Загорулькин  имел в виду не вложенную транзакцию, а последовательно две транзакции. В первой создаём полилинию (или полилинии) - контур штриховки. И на этом первая транзакция завершается. Во второй создаём саму штриховку. Так будет работать идеально в любом случае.

Я так делал года три назад, когда добавлял к штриховке внутренние контуры скрытия, и тогда была обычная транзакция ))
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 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);
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Александр Ривилис от 04-01-2018, 01:56:14
А вопрос то в чем?
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 04-01-2018, 01:58:24
А вопрос то в чем?

Почему так происходит? Это особенность автокада или надо со штриховкой производить дополнительные манипуляции, чтобы на создавалась нормальная?
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Александр Ривилис от 04-01-2018, 02:00:36
А вопрос то в чем?

Почему так происходит? Это особенность автокада или надо со штриховкой производить дополнительные манипуляции, чтобы на создавалась нормальная?
Что-то мне подсказывает, что точки ты задал неправильно - нет у тебя замыкающей точки. Посмотри этот пример: http://adn-cis.org/forum/index.php?topic=7368.msg22780#msg22780
Название: Re: Штриховка и OpenCloseTransaction
Отправлено: Алексей Терно от 04-01-2018, 02:04:18
Что-то мне подсказывает, что точки ты задал неправильно - нет у тебя замыкающей точки. Посмотри этот пример: http://adn-cis.org/forum/index.php?topic=7368.msg22780#msg22780
Точно!!! Вот что я забыл - добавить последнюю точку! Я же знаю про эту особенность ))
Спасибо!