1

Тема: Часто задаваемые вопросы (FAQ)

1. Как открыть два проекта одновременно?
В рамках одного запущенного экземпляра САПР такой возможности нет. Это усложнило бы и без того перегруженный окнами интерфейс САПР. При такой необходимости можно запустить два экземпляра САПР одновременно и совершать операции между ними.


2. Почему, открывая новый проект, сценарии остаются от старого?
Проект никак не связан с тестовыми сценариями, он самодостаточен, но в нём нет информации для создания динамики. Тестовые сценарии дают эту возможность, позволяя проводить многогранное тестирование целевого проекта. Для каждой проверяемой группы свойств или режима работы проекта, пользователь имеет возможность создать свой набор тестовых сценариев. Их можно хранить в рамках одного файла, но на практике может быть получено длинное, сложное в использовании дерево тестовых сценариев, и становится более удобным их разнесение по разным файлам по принципу, выбранному пользователем.


3. Как использовать несколько задач в проекте САПР на одном мониторе, так как они перекрывают друг друга?
Задача - это, по сути, и есть один монитор, генерация программного кода как-раз и происходит относительно одной определённой задачи. Соответственно, отображение на одном мониторе двух задач не возможно. Многозадачность САПР может быть полезна, например, для создания нескольких задач на основе одной аппаратной платформы целевого блока индикации, с вынесением описания общих аппаратных функций вверх на уровень проекта для совместного использования их всеми задачами. В разных окнах в ветвях проекта могут находиться общие для всех задач вычислительные узлы, функции вычисления и прорисовки, а в дереве прорисовки – некая общая для всех задач графика или механизм обработки данных. Так же локальные переменные, созданные на корневом уровне ветви проекта, доступны всем задачам дерева прорисовки. Используйте их для передачи информации от общего уровня проекта к задачам.


4. Есть ли возможность использования подложки (растровой картинки) для рисования поверх них приборов?
Да, существует примитив Символ. Т.к. прорисовка в деревьях происходит сверху вниз, то его необходимо расположить до отображения (выше в дереве) графических примитивов, которые должны его перекрывать.


5. Есть ли возможность использования картинок для прорисовки приборов?
Да, с помощью примитива Символ. При необходимости картинку можно вращать и(или) смещать через свойства его родительских групп.


6. Как рисовать круговую шкалу?
Наиболее простой способ – использование цикличности прорисовки группы. Создайте две группы так, чтобы одна была вложена в другую. Для родительской группы задайте имя переменной счётчика цикла и параметры цикличности. Для дочерней - привяжите (введя формулу) угол поворота группы к счётчику цикла. При этом всё, что находится внутри дочерней группы, будет на каждой итерации цикла поворачиваться на некоторый угол.


7. Как рисовать линейную шкалу?
Аналогично круговой шкале, за исключением того, что привязка должна происходить не к углу поворота группы, а к её смещению.


8. Некорректная индикация примитивов ‘Линия', ‘Прямоугольник’ и некоторых других при увеличении в окне редактора. С чем это связано?
В САПР используется полигональная модель графики на основе библиотеки DirectX. Все примитивы САПР имеют площадь, и это становится заметно при увеличении масштаба – они увеличиваются. Графический вывод библиотеки DirectX устроен так, что для получения правильной геометрии в единичном масштабе тела примитивов необходимо центрировать относительного пиксельной сетки. Например, производить смещение линии на пол пикселя в ту или иную сторону в зависимости от угла её наклона. При увеличении примитив смещается, а в единичном масштабе покрывает нужные пиксели, и именно в этом масштабе нужна выходная графика, например, на экранах систем индикации.
Кроме того, было решено подойти к рисованию примитивов с точки зрения математики и не прорисовывать последний пиксель в линиях, прямоугольниках и некоторых других примитивах. Если его рисовать, то у линии с координатами (0,0),(10,0) длина окажется 11, а не 10 пикселей, как должно быть.


9. Почему при заливке размер объекта уменьшается и приходится снова подгонять размер?
Нами считается, что, когда заливка есть, то нет линии контура фигуры. А когда заливки нет, то линия контура присутствует, и она имеет размер в обе стороны (внутрь и наружу), плюс возможная обводка примитива. Отсюда немного ‘прыгает’ геометрия.


10. Возможно ли создание фигуры с закругленными углами?
Это выполняется построением нескольких примитивов. Разработка САПР идёт по пути универсализации графики, предлагая минимально необходимый набор простейших графических примитивов. С их помощью можно реализовать достаточно сложные геометрические фигуры без необходимости доработки САПР и создания новых специфических примитивов.
САПР имеет механизм функций, и любая сложная или часто повторяющаяся графическая задача может быть выделена и обрамлена в функцию прорисовки. Вам необходимо создать функцию прорисовки, поместить в неё перечисленные выше примитивы и связать их графические свойства математическими зависимостями от входных параметров функции. Входными параметрами, например, могут выступать: x,y центра или нижнего левого угла фигуры, её ширина и высота, а так же радиус скругления. Эта функция может быть вызвана, как из другой функции прорисовки, так и из основного дерева прорисовки любое количество раз. В последующем функция может переноситься из проекта в проект и использоваться другими пользователями.
В идеале, команда разработчиком может создать и поддерживать ‘библиотечный’ проект предназначенный для хранения математических и графических функций, а так же вычислительных узлов, используемых ими в своих проектах. Это позволит упростить и ускорить разработку конечных проектов, а так же уменьшит число ошибок в них.


11. А как понять, когда использовать Новую маску, а когда Дополнение маски?
Это действительно важно понимать, т.к. влияет на скорость прорисовки, как в САПР, так и создаваемого программного кода. По возможности желательно всегда использовать дополнение, при этом происходит только дорисовка слоя маски площадями (телами) примитивов. Новая маска - это тоже дополнение, но перед этим стирается весь слой маски, т.е. он полностью очищается, и это занимает некоторое время.
Используйте Новую маску, когда вам нужно начать построение маски с новой конфигурацией, но только, если желаемую форму нельзя или достаточно сложно, или трудоёмко получить на основе формы существующей маски.


12. Что означает свойство "Конечный элемент" в примитивах и некоторых других элементах?
Для большинства пользователей это свойство никак не применимо. Оно появилось для поддержания функциональности автоматического генератора документации, созданного нами для одного из наших клиентов.
Многие элементы могут помечаться, как конечные, и по каждому из них в документации формируются таблицы зависимостей: формулы, используемые в свойствах элемента, переменные, используемые в этих формулах, и т.д. Это помогает легче прослеживать связи при тестировании индикационных кадров и определять, что от чего зависит.


13. Почему невозможен вызов функции прорисовки из функции вычисления?
Функцию вычисления можно вызывать из формулы, и было бы немного странно видеть прорисовку при вычислении формулы. Данное не очевидное поведение было исключено.


14. Как округлить вещественное число?
Для округления float величин используются встроенные функции вычислителя ‘round’ и ‘fround’. Первая возвращает значение типа int, вторая – float. Так же вы можете сделать это вручную, прибавив, если число >=0, или отняв, если число <0, величину 0.5, и приведя результат к типу int.


15. Как отбросить дробную часть вещественного числа?
Привести число к типу int или uint. Приведение к целому типу всегда просто отбрасывает дробную часть.


16. Почему математически тождественные выражения 3*240/170 и 3*(240/170) вычисляются по-разному?
В отличие от математики, где по умолчанию обычные, используемые нами, числа являются вещественными, описывая формулы в САПР, мы должны учитывать типы величин, с которыми совершаются операции. В обоих примерах для чисел 3, 240 и 170 не задана дробная часть, это означает, что это целые числа типа int. При совершении операций умножения и деления между типами int результат так же имеет тип int (дробная часть просто отбрасывается), при этом вычисление для данных операций происходит слева направо. Соответственно, в первом случае 3 будет умножено на 240 и разделено на 170, что в результате даст нам 4. Во-втором – 240 делится на 170, что даёт нам 1, и умножается на 3, и результат равен 3.
Более подробную информацию по написанию формул и работе с величинами разных типов вы можете найти в документации в разделе описывающем использование вычислителя САПР.


17. Есть несколько точек. Есть ли возможность задать эти точки массивом? А так же, как прописать формулу для задания их координат?
Да, можно задать массивом. Для ссылки на элемент массива переменной нужно в формульном выражении после имени переменной указать индекс в квадратных скобках. Индекс должен иметь тип int, отсчитываться от 0, и для переменных с размерностью 1 его, т.е. запись [0], можно не указывать.
Задать координаты точек можно, например, одним из двух способов:

  1. Использовать одну переменную с размерностью в два раза больше числа точек. Координата X первой точки будет var[0], Y первой точки - var[1], X второй точки - var[2], Y второй точки - var[3] и т.д.

  2. Завести две переменные одного типа и размерности, одна для координаты X, другая для Y. Координаты первой точки будут (var1[0], var2[0]), второй - (var1[1], var2[1]) и т.д..

Указание индекса возможно не только в правой, но и в левой части формулы. Более того, вместо индекса может находиться выражение, даже, при необходимости, с вызовом функций вычисления и вычислительных узлов, например:

var1[2] = 5
var1[ sin(func(12)) * var2[ var2[0] ] ] = 5

18. Можно ли как-то вынуть отдельный символ из строки?
Для извлечения части строки понадобится встроенная функция вычислителя ‘strext’ или ‘strextn’. Можно извлечь один символ, но это всё равно будет строка, т.е. значение типа string.


19. При запуске процесса моделирования выводится ошибка ‘Кодогенерация кнопки не запрещена’. Где нужно ставить запрет?
Запрет генерации программного кода, а так же генерации документации аналогичен свойству активности элементов. Запрет родительской группы создаёт запрет и для всего, что в неё включается. При этом не происходит ветвление и перебор дочерних элементов внутри неё. Соответственно запрет может быть выставлен для любой родительской группы (предка) по отношению к данной кнопке.
Чтобы наглядно увидеть запрет генерации программного кода, включите опцию меню ‘Рабочее пространство’->’Подсветка элементов деревьев’->’Участие в кодогенерации’.


20. Почему нет возможности добавить в группу или удалить из группы элемент переносом с помощью мыши?
В деревьях САПР перемещение мышью используется для смены порядка следования элементов, расположенных в рамках одной родительской ветви (на одном иерархическом уровне). Для всех других перемещений должны использоваться операции Вырезать/Копировать/Вставить.


21. Почему в окне редактора иногда перестает работать кнопка Esc?
Это связано с понятием фокуса ввода. Несмотря на то, что это естественный механизм операционной системы и используется в подавляющем большинстве приложений, он не всегда может быть интуитивно понятен. Именно то окно, которое имеет фокус ввода в данный момент, и получает уведомления от операционной системы о всех действиях мыши и нажатиях клавиш на клавиатуре. В САПР, чтобы окно получило фокус ввода (стало активным), необходимо нажать любую клавишу мыши на заголовка (или закладке) данного окна или в приделах его рабочей области. Это же касается и окна редактора. В некоторых состояниях окна САПР могут не иметь заголовка, что сделано для увеличения рабочего пространства, и их активность может быть не очевидна. Если, например, необходимо отменить какую-либо операцию, происходящую в редакторе, а клавиша Esc не срабатывает, то следует правой или средней клавишей мыши нажать в окне редактора, а затем снова нажать клавишу Esc.


22. Что означают записи [р], [с] и [рс] в заголовках окон?
Метка ‘р’ означает, что графические элементы дерева данного окна прорисовываются в окне редактора. Метка ‘с’ указывает на вывод характеристик выделенного элемента или группы элементов данного дерева в окно свойств.


23. При захвате окна САПР и наведении курсора мыши на одну из частей всплывающего маркера, окно стыкуется с некоторой частью экрана, но освободить его потом уже нельзя ни перетягиванием, ни путем нажатия на какую-либо кнопку, потому что заголовок окна исчезает и кнопок нет. Что происходит?
В подобных случаях для появления заголовка окна необходимо в настройках САПР (меню ‘Инструменты’->’Настройки…’) в разделе ‘Общее’ включить отображение одиночных закладок в основной рабочей области. Она располагается в центре окна САПР между стыкуемыми плавающими окнами, любое из которых может быть в неё помещено. По умолчанию одиночные окна в этой области не имеют поля заголовка. Это сделано сознательно для увеличения рабочего пространства.