Ошибки в API nanoCAD 24.0
Хотелось бы поделиться личными наблюдениями в портировании кода .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, но по сравнению с перечисленными, они не так существенны, во всяком случаи лично для меня, и их можно обойти.
Комментарии
-
Для 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, фактически не работают.
При вызове перечисленных методов происходит полная остановка графической системы. Курсор не перемещается по экрану в след за движением мыши, и не происходит обновление графики
на экране. Обновление происходит только по завершению методов.А отсюда поподробней, пожалуйста. Мы ничего подобного не наблюдаем. Везде ли повторяется? Какой номер сборки? Можете прислать ролик, демонстрирующий остановку графики?
0 -
Вот тут ролик
сообщения от 22 апреля.0 -
Можно ссылку?
0 -
Нашёл
0
Разделы
- Все разделы
- 26 Общие вопросы
- 4 Работа nanoCAD в ОС Linux
- 60 Платформа nanoCAD
- 3 nanoCAD GeoniCS
- 8 nanoCAD BIM Конструкции
- nanoCAD Механика PRO
- 16 nanoCAD BIM Электро
- 5 nanoCAD BIM Вентиляция
- 2 nanoCAD BIM ВК
- nanoCAD BIM Отопление
- 1 nanoCAD BIM СКС
- 8 nanoCAD BIM ОПС
- 1 nanoCAD Стройплощадка
- 1 nanoCAD Металлоконструкции
- nanoCAD Конструкции PS
- 2 TDMS Фарватер
- ReClouds
- NSR Specification
- Учебным заведениям и учащимся