Непонятное поведение полилинии

Автор Тема: Непонятное поведение полилинии  (Прочитано 8749 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Уж извиняйте, что так назвал тему, но более подходящего не придумалось ;D
Итак - создаю блок, создаю в блоке полилинию по коллекции точек (Polyline())- просто прямоугольник - все нормально. Но если я сначала по коллекции создаю маскировку (wipeout), то следом созданная полилиния ведет себя непонятно - она создается неправильного размера, да и не в том месте, хотя сохраняет заданную форму
Во вложении картинка: два блока. Один создан без маскировки, другой с маскировкой. На картинке видно как создается полилиния - обведена в кружок (маскировка создается правильно)
Ну и кусочек кода по добавлению маскировки и полилинии:
Код - C# [Выбрать]
  1. var pts2D = new Point2dCollection
  2.                 {
  3.                     new Point2d(0.0, 0.0),
  4.                     new Point2d(0.0 + l, 0.0),
  5.                     new Point2d(0.0 + l, 0.0 + h),
  6.                     new Point2d(0.0, 0.0 + h),
  7.                     new Point2d(0.0, 0.0)
  8.                 };
  9.             if (mask)
  10.             {
  11.                 var wo = new Wipeout();
  12.                 wo.SetFrom(pts2D, new Vector3d(0.0, 0.0, 0.1));
  13.                 wo.SetDatabaseDefaults(db);
  14.                 btr.AppendEntity(wo);
  15.                 tr.AddNewlyCreatedDBObject(wo, true);
  16.             }
  17.             var pline = new Polyline(pts2D.Count);
  18.             for (var i = 0; i < pts2D.Count; i++)
  19.                 pline.AddVertexAt(i, pts2D[i], 0.0, 0.0, 0.0);
  20.             pline.SetDatabaseDefaults(db);
  21.             btr.AppendEntity(pline);
  22.             tr.AddNewlyCreatedDBObject(pline, true);

Отмечено как Решение Александр Пекшев aka Modis 22-06-2015, 23:17:36

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Непонятное поведение полилинии
« Ответ #1 : 20-06-2015, 19:14:06 »
Не назову это решением проблемы, но при таком варианте кода проблемы нет:
Код - C# [Выбрать]
  1. if (mask)
  2.             {
  3.                 var pts2D1 = new Point2dCollection
  4.                 {
  5.                     new Point2d(0.0, 0.0),
  6.                     new Point2d(0.0 + l, 0.0),
  7.                     new Point2d(0.0 + l, 0.0 + h),
  8.                     new Point2d(0.0, 0.0 + h),
  9.                     new Point2d(0.0, 0.0)
  10.                 };
  11.                 var wo = new Wipeout();
  12.                 wo.SetFrom(pts2D1, new Vector3d(0.0, 0.0, 0.1));
  13.                 wo.SetDatabaseDefaults(db);
  14.                 btr.AppendEntity(wo);
  15.                 tr.AddNewlyCreatedDBObject(wo, true);
  16.             }
  17.             var pts2D = new Point2dCollection
  18.                 {
  19.                     new Point2d(0.0, 0.0),
  20.                     new Point2d(0.0 + l, 0.0),
  21.                     new Point2d(0.0 + l, 0.0 + h),
  22.                     new Point2d(0.0, 0.0 + h),
  23.                     new Point2d(0.0, 0.0)
  24.                 };
  25.             var pline = new Polyline(pts2D.Count);
  26.             for (var i = 0; i < pts2D.Count; i++)
  27.                 pline.AddVertexAt(i, pts2D[i], 0.0, 0.0, 0.0);
  28.             pline.SetDatabaseDefaults(db);
  29.             btr.AppendEntity(pline);
  30.             tr.AddNewlyCreatedDBObject(pline, true);
Ведь в первом случае (код в топике) я же не меняю коллекцию точек!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Непонятное поведение полилинии
« Ответ #2 : 20-06-2015, 19:47:35 »
Ну так проверь меняется она (коллекция) или нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Непонятное поведение полилинии
« Ответ #3 : 20-06-2015, 21:37:25 »
Ну так проверь меняется она (коллекция) или нет.
Проверил - меняется! И я совершенно не могу понять этого)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Непонятное поведение полилинии
« Ответ #4 : 20-06-2015, 22:10:55 »
Я проверил упрощенный вариант в AutoCAD 2015:
Код - C# [Выбрать]
  1. [CommandMethod("TestWP", CommandFlags.Modal)]
  2. public void MyCommand() // This method can have any name
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   double l = 10, h = 20;
  9.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  10.   {
  11.     BlockTableRecord btr =
  12.       tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  13.     var pts2D = new Point2dCollection
  14.                 {
  15.                     new Point2d(0.0, 0.0),
  16.                     new Point2d(0.0 + l, 0.0),
  17.                     new Point2d(0.0 + l, 0.0 + h),
  18.                     new Point2d(0.0, 0.0 + h),
  19.                     new Point2d(0.0, 0.0)
  20.                 };
  21.     var wo = new Wipeout();
  22.     // wo.SetFrom(new Point2dCollection(pts2D.ToArray()), new Vector3d(0.0, 0.0, 0.1));
  23.     wo.SetFrom(pts2D, new Vector3d(0.0, 0.0, 0.1));
  24.     wo.SetDatabaseDefaults(db);
  25.     btr.AppendEntity(wo);
  26.     tr.AddNewlyCreatedDBObject(wo, true);
  27.     var pline = new Polyline(pts2D.Count);
  28.     for (var i = 0; i < pts2D.Count; i++)
  29.       pline.AddVertexAt(i, pts2D[i], 0.0, 0.0, 0.0);
  30.     pline.SetDatabaseDefaults(db);
  31.     btr.AppendEntity(pline);
  32.     tr.AddNewlyCreatedDBObject(pline, true);
  33.     tr.Commit();
  34.   }
  35. }
Баг имеет место:



Точнее это побочный эффект, когда метод влияет на свои аргументы. Но так как это нигде не описано, то считаю это багом. Отправлю в ADN DevHelp.
В качестве workaround могу предложить вместо pts2D использовать new Point2dCollection(pts2D.ToArray())
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Непонятное поведение полилинии
« Ответ #5 : 22-06-2015, 12:41:36 »
Получил подтверждение от ADN DevHelp о таком необычном поведении метода Wipeout.SetFrom
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Непонятное поведение полилинии
« Ответ #6 : 22-06-2015, 12:59:14 »
Получил подтверждение от ADN DevHelp о таком необычном поведении метода Wipeout.SetFrom
Какой обтекаемый ответ... И как это правильно читать? Варианты:
1. Да, ADN DevHelp подтвердил, что это баг.
2. ADN DevHelp заявляет, что "так и задумано".

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Непонятное поведение полилинии
« Ответ #7 : 22-06-2015, 14:21:24 »
Получил подтверждение от ADN DevHelp о таком необычном поведении метода Wipeout.SetFrom
Возможно стоит создать ветку БАГИ автокада и переносить сообщения туда.
Составить табличку что найдено/поправлено и в какой версии.

Ну например, интригующий баг с анотативным блоком, когда объектов аннотаций нет, а блок аннотативный, и когда поправят.

Мне также интересно баг или не баг:
305 размеров с 50ю масштабами аннотаций = тормоза при сохранении. Да левые масштабы, но тормозит при незначительном их количестве.

А также легкое создание невидимого DBText во всех версиях автокада, когда в редакторе проверяется, что строка пуста и отменяет ввод, а в редакторе свойств не проверяет и создает Entity without graphics representation.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Непонятное поведение полилинии
« Ответ #8 : 22-06-2015, 16:18:52 »
Возможно стоит создать ветку БАГИ автокада и переносить сообщения туда.
Такая ветка есть: Ошибки в AutoCAD и вертикальных приложениях
В ней свои правила раздела, описывающие как готовить информацию о багах. Если ты согласно правилам раздела опишешь указанные тобой баги - я передам в Autodesk.
Баги в API - это отдельная песня. Как только мы находим баги - я их сразу передаю в Autodesk. Делать под них отдельный раздел не вижу смысла, т.к. чаще всего эти баги относятся к конкретному API и смешивать их не следует.

Какой обтекаемый ответ... И как это правильно читать? Варианты:
1. Да, ADN DevHelp подтвердил, что это баг.
2. ADN DevHelp заявляет, что "так и задумано".
Пришли к варианту 3. - такое поведение будет описано в документации.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Непонятное поведение полилинии
« Ответ #9 : 22-06-2015, 16:38:58 »
Пришли к варианту 3. - такое поведение будет описано в документации.
Off-Topic: показать
Внимание! Ботинки нашей компании имеют свою особенность: левый нужно одевать на правую ногу, а правый на левую (причём носок должен присутствовать только на левой ноге, иначе правый ботинок будет жать). Поскольку это условие задокументировано, то вы не можете говорить, что это баг! Просто воспринимайте это как особенность реализации от нашей компании.

Плохо это хотя бы тем, что сторонние компании, реализующие так называемый CAD .NET API Classic по идее должны повторять эти "документированные фичи", дабы код на уровне исходников оставался совместимым с AutoCAD. В противном случае придётся городить очередной огород из #if/#elif/#endif.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Непонятное поведение полилинии
« Ответ #10 : 22-06-2015, 16:43:40 »
Плохо это хотя бы тем, что сторонние компании, реализующие так называемый CAD .NET API Classic по идее должны повторять эти "документированные фичи", дабы код на уровне исходников оставался совместимым с AutoCAD.
Не думаю, что Autodesk задаётся вопросом совместимости сторонних API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Непонятное поведение полилинии
« Ответ #11 : 22-06-2015, 16:45:09 »
Не думаю, что Autodesk задаётся вопросом совместимости сторонних API.
Я даже уверен, что по сути его не интересует и то, что будут делать его прикладные программисты, судя по такому "способу решения". Жаль. Мне подобный способ "решения" кажется очень грязным и способствующим появлению путаницы и багов в дальнейшем. Это очень настораживает и заставляет лишний раз задуматься...