Цель состоит в том, чтобы произвести так называемое винтовое зубчатое колесо
как показано на рисунке ниже:
Я завершил генерацию профиля (TopoDS_Wire
-> TopoDS_Face
с помощью BRepBuilderAPI_MakeFace
) — лицо на верхней части изображенного механизма.
Я думаю, что задача состоит в том, чтобы линейно проведите поверхность / проволоку вдоль оси зубчатой передачи, проходящей через отверстие в середине, поворачивая поверхность на постоянный угол, определяющий угол наклона спирали, пока не будет достигнута желаемая высота зубчатой передачи…
Я думал об использовании GeomFill_Pipe
или же BRepOffsetAPI_MakePipeShell
но я понятия не имею, как его использовать …
Не могли бы вы взглянуть и поделиться какими-нибудь идеями / фрагментами кода, которые могут помочь мне или, по крайней мере, подтолкнуть меня в правильном направлении для расследования?
Большое спасибо всем, кто хочет мне помочь …
К сожалению, никто не ответил, пока я не нашел решение самостоятельно. Вот как это может помочь кому-то, кто сталкивается с той же проблемой однажды …
Описание алгоритма:
Ширина обода зубчатого колеса делится на несколько шагов (nSteps
). Для каждого шага требуемый угол поворота, а также перемещение вычисляются по формуле:
rotation_angle = atan( b_TranslationStep * CONST_FACTOR )
где
b_TranslationStep
ширина обода, которая соответствует вычисленному шагу,
CONST_FACTOR = 2 * tan( beta ) / d_a
где
beta
угол винтовой зубчатой передачи
d_a
наружный диаметр круга
Используя преобразования вращения и перемещения, примененные к профилю обода, создаются проволочные сечения, определяющие форму обода. После этого провода секции используются BRepOffsetAPI_ThruSections
создать результирующую форму ободка винтовой зубчатой передачи.
Грани профиля зубчатой передачи выполнены в плоскости XY, а ось зубчатой передачи совмещена с осью Z. GearProfile построен ранее и представляет собой замкнутый провод, «содержащий» все зубы.
Реализация:
/* TopoDS_Wire GearProfile is constructed previously - out of the question scope */
TopoDS_Shape HelicalGearRim( const TopoDS_Wire & GearProfile )
{
double ToothFaceWidth = 10e-3; /* 10mm */
double HelixAngle = 0.349; /* [rad] --> 20deg */
double OutsideDiameter = 42e-3; /* 42mm */
int nSteps = 10;
/* Make solid with the faces interpolated */
BRepOffsetAPI_ThruSections tShapeGen( Standard_True, Standard_False );
/* Instantiate rim profile transformations */
gp_Trsf RimProfileRotation;
gp_Trsf RimProfileTranslation;
/* Initially add the first section wire - the original rim profile */
tShapeGen.AddWire( RimProfile );
/* Calculate translation step equal to tooth face width divided by required number of steps */
const double TranslationStep = ToothFaceWidth / nSteps;
/* Constant part of rotation angle calculation is referred as factor */
const double Factor = 2.0 * std::tan( HelixAngle ) / OutsideDiameter;
/* Calculate rotation angle and translation for each step */
for( int i = 1; i <= nSteps; i++ )
{
/* Setup rotation for current step */
RimProfileRotation.SetRotation( gp::OZ(), std::atan( i * TranslationStep * Factor ) );
/* Setup translation for current step */
RimProfileTranslation.SetTranslation( gp_Vec( 0.0, 0.0, ( i * TranslationStep ) ) );
/* Apply the transformations */
BRepBuilderAPI_Transform RotationTransformer( RimProfile, RimProfileRotation );
BRepBuilderAPI_Transform TranslationTransformer( RotationTransformer.Shape(), RimProfileTranslation );
/* Add generated wire of current step section */
tShapeGen.AddWire( TopoDS::Wire( TranslationTransformer.Shape() ) );
}
/* Generate the shape out of the section wires created previously */
return( tShapeGen.Shape() );
}
Реализация, приведенная выше, не работает автономно, но протестирована в моем приложении и доказала свою работоспособность. Это может помочь любому, кто ищет принцип построения формы винтовой зубчатой передачи … Смотрите результат на скриншоте:
Надеюсь, это кому-нибудь поможет. Ура Мартин
Других решений пока нет …