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

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 20-06-2015, 19:08:08

Название: Непонятное поведение полилинии
Отправлено: Александр Пекшев aka Modis от 20-06-2015, 19:08:08
Уж извиняйте, что так назвал тему, но более подходящего не придумалось ;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);
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Пекшев aka Modis от 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);
Ведь в первом случае (код в топике) я же не меняю коллекцию точек!
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Ривилис от 20-06-2015, 19:47:35
Ну так проверь меняется она (коллекция) или нет.
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Пекшев aka Modis от 20-06-2015, 21:37:25
Ну так проверь меняется она (коллекция) или нет.
Проверил - меняется! И я совершенно не могу понять этого)
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Ривилис от 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. }
Баг имеет место:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F3505%2F7842324.4%2F0_1015ab_3f291cbf_orig.png&hash=7835c68089ab3e9ae1baaf2d86f064e8)

Точнее это побочный эффект, когда метод влияет на свои аргументы. Но так как это нигде не описано, то считаю это багом. Отправлю в ADN DevHelp.
В качестве workaround могу предложить вместо pts2D использовать new Point2dCollection(pts2D.ToArray())
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Ривилис от 22-06-2015, 12:41:36
Получил подтверждение от ADN DevHelp о таком необычном поведении метода Wipeout.SetFrom
Название: Re: Непонятное поведение полилинии
Отправлено: Андрей Бушман от 22-06-2015, 12:59:14
Получил подтверждение от ADN DevHelp о таком необычном поведении метода Wipeout.SetFrom
Какой обтекаемый ответ... И как это правильно читать? Варианты:
1. Да, ADN DevHelp подтвердил, что это баг.
2. ADN DevHelp заявляет, что "так и задумано".
Название: Re: Непонятное поведение полилинии
Отправлено: Привалов Дмитрий от 22-06-2015, 14:21:24
Получил подтверждение от ADN DevHelp о таком необычном поведении метода Wipeout.SetFrom
Возможно стоит создать ветку БАГИ автокада и переносить сообщения туда.
Составить табличку что найдено/поправлено и в какой версии.

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

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

А также легкое создание невидимого DBText во всех версиях автокада, когда в редакторе проверяется, что строка пуста и отменяет ввод, а в редакторе свойств не проверяет и создает Entity without graphics representation.
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Ривилис от 22-06-2015, 16:18:52
Возможно стоит создать ветку БАГИ автокада и переносить сообщения туда.
Такая ветка есть: Ошибки в AutoCAD и вертикальных приложениях (http://adn-cis.org/forum/index.php?board=40.0)
В ней свои правила раздела, описывающие как готовить информацию о багах. Если ты согласно правилам раздела опишешь указанные тобой баги - я передам в Autodesk.
Баги в API - это отдельная песня. Как только мы находим баги - я их сразу передаю в Autodesk. Делать под них отдельный раздел не вижу смысла, т.к. чаще всего эти баги относятся к конкретному API и смешивать их не следует.

Какой обтекаемый ответ... И как это правильно читать? Варианты:
1. Да, ADN DevHelp подтвердил, что это баг.
2. ADN DevHelp заявляет, что "так и задумано".
Пришли к варианту 3. - такое поведение будет описано в документации.
Название: Re: Непонятное поведение полилинии
Отправлено: Андрей Бушман от 22-06-2015, 16:38:58
Пришли к варианту 3. - такое поведение будет описано в документации.
Off-Topic: показать
Внимание! Ботинки нашей компании имеют свою особенность: левый нужно одевать на правую ногу, а правый на левую (причём носок должен присутствовать только на левой ноге, иначе правый ботинок будет жать). Поскольку это условие задокументировано, то вы не можете говорить, что это баг! Просто воспринимайте это как особенность реализации от нашей компании.

Плохо это хотя бы тем, что сторонние компании, реализующие так называемый CAD .NET API Classic по идее должны повторять эти "документированные фичи", дабы код на уровне исходников оставался совместимым с AutoCAD. В противном случае придётся городить очередной огород из #if/#elif/#endif.
Название: Re: Непонятное поведение полилинии
Отправлено: Александр Ривилис от 22-06-2015, 16:43:40
Плохо это хотя бы тем, что сторонние компании, реализующие так называемый CAD .NET API Classic по идее должны повторять эти "документированные фичи", дабы код на уровне исходников оставался совместимым с AutoCAD.
Не думаю, что Autodesk задаётся вопросом совместимости сторонних API.
Название: Re: Непонятное поведение полилинии
Отправлено: Андрей Бушман от 22-06-2015, 16:45:09
Не думаю, что Autodesk задаётся вопросом совместимости сторонних API.
Я даже уверен, что по сути его не интересует и то, что будут делать его прикладные программисты, судя по такому "способу решения". Жаль. Мне подобный способ "решения" кажется очень грязным и способствующим появлению путаницы и багов в дальнейшем. Это очень настораживает и заставляет лишний раз задуматься...