В продолжение этого урока «Отзеркаливание текста в параметрическом объекте»
Работать будем с получившимся объектом в предыдущем уроке и будем его упрощать и дорабатывать.
На самом деле, действий не так много придётся совершить =) Благодаря случайности обратил внимание, что у всех объектов разница углов между vecDirection и осью oZ, и vecPlane и осью o Z будет всегда равна 90 градусов. Только у неотзеркаленых она положительная,А у отзеркаленых — отрицательн
Давайте проверим это и добавим два параметра в наш объект:
rAngleZ1, "Угол Z (Direction)",
rAngleZ2, "Угол Z (Plane)",
Так же добавим их в функцию MirrorObject:
rAngleZ1 = angleTwoPi(vecDirection,oZ);
rAngleZ2 = angleTwoPi(vecPlane,oZ);
и закомментируем наши rAngleX и rAngleY в функции MirrorObject, чтобы не производилось отзеркаливание объекта.
Достаём объект из базы, поворачиваем его всячески и зеркалим, убеждаясь в словах выше:
Видим, что по-мимо углов в 90 и -90 градусов присутствует углы в -270 и 270 градусов соответственно, причина этому то, что когда величина угла достигает 360 градусов она сбрасывается на 0. и получается, что 10-280=-270,но при этом 370-280=90.
Не забываем отразить это в нашем коде.
Для удобства в функции MirrorObject добавим переменную a равную a=rAngleZ1-rAngleZ2
Пишем в функции MirrorObject:
rAngleZ1 = angleTwoPi(vecDirection,oZ);
rAngleZ2 = angleTwoPi(vecPlane,oZ);
a=rAngleZ1-rAngleZ2;
if(a==-90 || a==270)
{
vecDirection=-vecDirection;
}
Теперь наш объект зеркалится обратно, но остаётся проблема с поворотом текста
Для поворота текста будем работать с переменной rAngleY, «Угол Y», поэтому надо её расскомментировать.
Теперь обновляем наши объекты и определяем уже не точные значения, а промежуток, в котором нам надо развернуть текст на 180 градусов.
У меня он получился от 90<rAngleY<=270
Исходя из этого, обновляем нашу функцию следующим образом, тем самым приводя её к итоговому виду
rAngleY = angleTwoPi(oY,vecPlane);
rAngleZ1 = angleTwoPi(vecDirection,oZ);
rAngleZ2 = angleTwoPi(vecPlane,oZ);
a=rAngleZ1-rAngleZ2;
sTextAngle=0;
if(a==-90 || a==270)
{
vecDirection=-vecDirection;
}
if(rAngleY>90 && rAngleY<=270)
{
sTextAngle=180;
}
Обновляем наши объекты и наслаждаемся результатом =)
Как результат наших доработок можно отметить не только более изящный код, но и отсутствие привязок к определенному углу поворота объекта — теперь даже при повороте на условные 37.93 градуса и отзеркаливание, наш объект всё равно корректно отобразит имеющийся текст.
В этой небольшой статье рассмотрим как можно отредактировать стандартный параметрический объект, чтобы за базовую точку объекта можно было не переносить объект, а растягивать. Это удобно будет при работе со швеллерами, трубами и прочими объектами, которые приходится растягивать в обе стороны.
Для примера будет использовать стандартный параметрический объект трубу по ГОСТ 167-69 (Несущие конструкции -> КМ -> Трубы)
Нас интересует функция OnMoveGripPoint
По умолчанию она выглядит так:
function OnMoveGripPoint{
if(NMovingGrip == 1){
L = vecLen(pntGrip0 - pntGrip1);
vecDirection = pntGrip1 - pntGrip0;
LoadInCache( B, s );
SelectInCache( "kFirst", "B", "~", B, "s", "~", s);
} else {
pntOrigin = pntGrip0;
};
};
Давайте для удобства приведём к более понятному виду и уйдём от конструкции else
function OnMoveGripPoint
{
if(NMovingGrip == 0)
{
pntOrigin = pntGrip0;
};
if(NMovingGrip == 1)
{
L = vecLen(pntGrip0 - pntGrip1);
vecDirection = pntGrip1 - pntGrip0;
LoadInCache( B, s );
SelectInCache( "kFirst", "B", "~", B, "s", "~", s);
};
};
Предыдущая запись скрипта имеет права быть, т.к. в объекте всего 2 ручки, но будет неудобна при условии добавления новых ручек, да и в принципе наша запись сразу позволяет понять, к какой ручке мы обращаемся.
Итак, чтобы заставить объект удлиняться за базовую точку, надо прописать изменение длины объекта при перемещение базовой точки.
Получаем:
if(NMovingGrip == 0)
{
pntOrigin = pntGrip0;
L = vecLen(pntGrip1 - pntGrip0);
};
Ура, наш объект растягивается!)
Осталось дописать поведение вектора направления объекта:
if(NMovingGrip == 0)
{
pntOrigin = pntGrip0;
L = vecLen(pntGrip1 - pntGrip0);
vecDirection = pntGrip1 - pntGrip0;
};
И всё, теперь всё работает просто великолепно)
Вот такими несложными манипуляциями мы упростили работу со стандартным параметрическим объектом, добавив возможность растягивать его в обе стороны =)
Одно из основных возможностей версии СПДС GraphiCS 2021 является управление объектами чертежа из табличного редактора. Продемонстрируем на примере автоматического маркирования колонн.
На плане размещены колонны с помощью инструмента СПДС GraphiCS. По умолчанию колоннам не проставляется позиция и метка (марка колонны). Когда на плане размещено много колонн, то вносить эти позиции вручную трудоемко.
Небольшая статейка о том, как сделать, чтобы при отзеркаливание параметрического объекта СПДС не зеркалился текст прописаный в геометрии объекта (UText)
Даже если вы создадите для объекта вид сзади, который будет зеркален виду спереди, текст в геометрии себя будет вести неадекватно
Для получения значения ячейки существует два способа:
Есть две таблицы (далее таблица1 и таблица2). Перенесем значение ячейки 1A второй таблицы в первую.
Допустим нужно управлять отображением шапки таблицы. Для этого не надо создавать две разные таблицы. Нужно настроить управление через форму высотой строки шапки.
СПДС GraphiCS содержит базу параметрических объектов, которая открыта для редактирования и наполнения пользовательскими объектами. Объекты можно вставлять из базы, редактировать за ручки, добавлять виды с разрезом или с размерами, подрезать и использовать характеристики в дальнейших спецификациях, отчетах, таблицах.
Вкладка Базы элементов, параметрический объект на чертеже и контекстное меню объекта
Диалоговое окно объекта для примера
Решаем такую пользовательскую задачу. Допустим в чертеже есть ряд блоков с отображаемой атрибутивной информацией, которую нужно изменить небольшим действием, не прибегая к выбору каждого блока и ввода через свойства новых значений. Для решения такой задачи можно воспользоваться возможностями табличного редактора СПДС GraphiCS (=nanoCAD СПДС).
Как это сделать показано на видео.
Опытным пользователям СПДС GraphiCS известно, что в функционале программного обеспечения есть мощный параметрический инструмент создания типовых деталей, с набором правил поведения, приблизительно по аналогии с динамическими блоками AutoCAD, которые к слову и чести СПДС GraphiCS появились значительно позже СПДС-объектов. Этот инструмент называется Мастер объектов (MechWizard). Он был создан для простых пользователей, не владеющих навыками программирования.
Порой решаются неординарные задачи, никак к сфере строительного проектирования не относящиеся и тем не менее представляющие интерес с функциональной стороны.
Насколько сложно или не очень создать параметрический объект и сделать для него списки выбора продемонстрированы в видеоролике технического специалиста. Посмотрите видео по ссылке ниже и не удивляетесь, что даже для создания раскроя инструмент Мастера объектов вполне справляется с задачей.
Подсчет блоков AutoCAD, конечно, можно выполнить средствами самой платформы. Однако, в видео демонстрируется возможность табличного редактора СПДС GraphiCS упорядить информацию более сложного порядка.
Спасибо Якову за пример.