Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: vladimir.leontyev от 22-12-2022, 20:07:08

Название: Как использовать transfromBy для масштабирования?
Отправлено: vladimir.leontyev от 22-12-2022, 20:07:08
Всем привет,
есть AcDbEntity (AcDb3dSolid, AcDbCircle..) нужно его немного уменьшить/увеличить с помощью transfromBy()
не подскажите в какую сторону думать (может примерчик на с++)? спасибо
Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: Александр Ривилис от 24-12-2022, 03:25:31
vladimir.leontyev,
Что тут думать, программировать нужно!
Код - C++ [Выбрать]
  1. double scale = 3.0; // Увеличиваем в три раза
  2. AcGePoint3d p(10,20,30); // Точка относительно которой производится масштабирование
  3. AcGeMatrix3d mat; mat.setToScaling(scale,p);
  4. pEnt->transformBy(mat);
Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: vladimir.leontyev от 25-12-2022, 00:04:51
Спасибо. Нашел тут еще старую ветку с вашим участием https://www.caduser.ru/forum/topic47418.html - Ну, очень полезно.

Я попробовал два варианта
mat.setToScaling(scale,p); и mat.scaling(scale,p);
работают по разному, не пойму почему...

Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: Александр Ривилис от 25-12-2022, 02:04:50
Я попробовал два варианта
mat.setToScaling(scale,p); и mat.scaling(scale,p);
работают по разному, не пойму почему...
То есть? Приведи код и покажи в чем различие.
Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: vladimir.leontyev от 26-12-2022, 08:51:03
.. извиняюсь, мой косяк, setToScaling работает,
разбираюсь сейчас с базовой точкой масштабирования, оказалось не все так просто.
еще раз thanks
Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: vladimir.leontyev от 09-01-2023, 11:45:03
Всем привет. Есть еще вопрос по теме.
Как задать разный scaling по осям?
Я попробовал:

Код - C++ [Выбрать]
  1. AcGeMatrix3d mat;
  2. AcGeScale3d(scaleX, scaleY, scaleZ).getMatrix(mat);
  3. pEnt->transformBy(mat);

Это вроде работает, но невозможно задать базовую точку, относительно которой производится масштабирование.
Как тут быть? Спасибо
(извиняюсь за неформатированный код)
Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: Александр Ривилис от 10-01-2023, 19:22:59
Как тут быть?
Первая мысль, которая приходит в голову - сделать три трансформации:
1. Перенос из базовой точки в начало координат.
2. Масштабирование.
3. Перенос в соответствии с новым положением базовой точки с учетом масштабирования.
P.S.: Очень немного примитивов поддерживают масштабирование с разными масштабами по X, Y, Z. Из того, что мне помнится - это AcDbBlockReference и AcDb3dSolid и кажется еще AcDbEllipse. В противном случае transformBy возвращает Acad::eCannotScaleNonUniformly
Название: Re: Как использовать transfromBy для масштабирования?
Отправлено: vladimir.leontyev от 11-01-2023, 17:59:19
Спасибо за совет, мне это помогло. Я делал scaling после translation, а надо наоборот!