В этой небольшой статье рассмотрим как можно отредактировать стандартный параметрический объект, чтобы за базовую точку объекта можно было не переносить объект, а растягивать. Это удобно будет при работе со швеллерами, трубами и прочими объектами, которые приходится растягивать в обе стороны.
Для примера будет использовать стандартный параметрический объект трубу по ГОСТ 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; };
И всё, теперь всё работает просто великолепно)
Вот такими несложными манипуляциями мы упростили работу со стандартным параметрическим объектом, добавив возможность растягивать его в обе стороны =)
Видео с примером работы параметрического объекта - https://forum.nanocad.ru/uploads/monthly_2020_12/ymE7GErx7j.mp4.b6d000efff6ef6fbd0019719510163a9.mp4