Ошибки в API nanoCAD 24.0

Maksim_Yablokov
отредактировано 27 апр Раздел: API

Хотелось бы поделиться личными наблюдениями в портировании кода .Net C# и Lisp из AutoCAD в nanoCAD и с какими ошибками столкнулся.

Основное - это неработоспособный пользовательский ввод.

В частности, методы GetAngle, GetDistance, JigPrompts.AcquireAngle и JigPrompts.AcquireDistance в C#, ровно как и getangle и getdist в Lisp, фактически не работают.

При вызове перечисленных методов происходит полная остановка графической системы. Курсор не перемещается по экрану в след за движением мыши, и не происходит обновление графики на экране. Обновление происходит только по завершению методов.

Метод GetPoint работает, но тоже страдает стабильностью. После вызова метода, и остановки движения мыши на короткий момент времени, метод тоже может вызвать зависание графической системы. Помимо этого, обнаружено различие в классе PromptPointOptions. Различия в установке системы координат для базовой точки. Для NC требуется точка в системе МСК, а для AC в ПСК. И соответственно, имеются различия в возвращаемой системе координат для GetPoint. В NC возвращает точку в системе МСК, в AC в ПСК.

Не могу не затронуть и давнюю проблему с GetSelection.

В частности, невозможно настроить PromptSelectionOptions для выбора одно примитива и без выбора рамкой. Параметры SingleOnly = true и SelectEverythingInAperture = true на выбор не влияют и позволяют выбрать более одного примитива. Аналогично и в Lisp для SSGET - невозможно указать связку ключей (ssget "_:S:E") - получим исключение.

Пример реализации метода LispFunction и GetSelection

[AcRtm.LispFunction("Select")]
public static object Select(AcDbs.ResultBuffer rb)
{
AcApp.Document doc = AcApp.Application.DocumentManager.MdiActiveDocument;
AcEdi.Editor ed = doc.Editor; //Нужно выбрать один примитив, соответствующий заданному фильтру.
//Выбор объекта должен осуществляться точечно, а не рамкой выбора //и выбран должен быть только один. AcEdi.PromptSelectionOptions opts = new AcEdi.PromptSelectionOptions
{
SingleOnly = true, //Sets the :S mode
SelectEverythingInAperture = true, //Sets the :E mode
MessageForAdding = "Выберите объект:"
}; AcEdi.PromptSelectionResult psr = ed.GetSelection(opts);
if (psr.Status != AcEdi.PromptStatus.OK)
return null; AcDbs.ResultBuffer rbOut = new AcDbs.ResultBuffer(); //В NC24 невозможно передать SelectionSet в ResultBuffer, это выдаст исключение.
//rbOut.Add(new AcDbs.TypedValue((int)HmRtm.LispDataType.SelectionSet, psr.Value)); //return rbOut; //Возвращаем результат выбора списком ObjectId AcDbs.ObjectId[] ids = psr.Value.GetObjectIds();

rbOut.Add(new AcDbs.TypedValue((int)HmRtm.LispDataType.ListBegin));
foreach (AcDbs.ObjectId id in ids)
{
rbOut.Add(new AcDbs.TypedValue((int)HmRtm.LispDataType.ObjectId, id));
}
rbOut.Add(new AcDbs.TypedValue((int)HmRtm.LispDataType.ListEnd));

return rbOut; }

Чтобы продемонстрировать некорректность работы методов вызывающих остановку графической системы приведу следующие две строчки кода на Lisp:

(getangle (getpoint "\nPic point:") "\nSet angle:")
(getdist (getpoint "\nPic from point:") "\nPic to point:")

В дополнение к Lisp, при работе функций grread, grdraw и redraw в связке тоже наблюдается зависание графической системы. Подозреваю, что к зависанию графической системы, приводит функция grread.

Функция redraw тоже работает некорректно и не позволяет функции grdraw выполнить рисование временной графики. Похоже, что redraw работает асинхронно с grdraw.

Для демонстрации представлена команда TEST

(defun c:test (/ from gr to)
(if
(and
(setq from (vl-catch-all-apply 'getpoint (list "\nPic point:")))
(not (vl-catch-all-error-p from))
)
(while
(and
(setq gr (vl-catch-all-apply 'grread (list T 5 0)))
(not (vl-catch-all-error-p gr));нажатие Esc
(= 5 (car gr)) ;5 - перемещение курсора
)
(setq to (trans (cadr gr) 1 0))
(redraw)
(grdraw from to 1)
)
)
(redraw)
(princ)
)

Есть ещё несколько замечаний к API, но по сравнению с перечисленными, они не так существенны, во всяком случаи лично для меня, и их можно обойти.

Теги темы:

Комментарии

  • ISL
    ISL
    отредактировано 2 мая

    Для NC требуется точка в системе МСК, а для AC в ПСК. И соответственно,
    имеются различия в возвращаемой системе координат для GetPoint. В NC
    возвращает точку в системе МСК, в AC в ПСК.

    Да, это так, не баг, а фича, меняться не будет.

    Невозможно настроить PromptSelectionOptions для выбора одно примитива и без выбора рамкой. Параметры SingleOnly = true и SelectEverythingInAperture = true на выбор не влияют и позволяют выбрать более одного примитива. Аналогично и в Lisp для SSGET - невозможно
    указать связку ключей (ssget "_:S:E") - получим исключение.

    Войдёт в техобновление 24.0.

    В NC24 невозможно передать SelectionSet в ResultBuffer, это выдаст исключение

    Стоит в планах на следующую версию.

    В частности, методы GetAngle, GetDistance, JigPrompts.AcquireAngle и JigPrompts.AcquireDistance в C#, ровно как и getangle и getdist в Lisp, фактически не работают.

    При вызове перечисленных методов происходит полная остановка графической системы. Курсор не перемещается по экрану в след за движением мыши, и не происходит обновление графики
    на экране. Обновление происходит только по завершению методов.

    А отсюда поподробней, пожалуйста. Мы ничего подобного не наблюдаем. Везде ли повторяется? Какой номер сборки? Можете прислать ролик, демонстрирующий остановку графики?

  • Oleg
    отредактировано 3 мая

    Вот тут ролик https://t.me/nanocad/345 сообщения от 22 апреля.

  • Можно ссылку?

  • Нашёл