Как использовать transfromBy для масштабирования?

Автор Тема: Как использовать transfromBy для масштабирования?  (Прочитано 11650 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн vladimir.leontyevАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Всем привет,
есть AcDbEntity (AcDb3dSolid, AcDbCircle..) нужно его немного уменьшить/увеличить с помощью transfromBy()
не подскажите в какую сторону думать (может примерчик на с++)? спасибо

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
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);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн vladimir.leontyevАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Спасибо. Нашел тут еще старую ветку с вашим участием https://www.caduser.ru/forum/topic47418.html - Ну, очень полезно.

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


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я попробовал два варианта
mat.setToScaling(scale,p); и mat.scaling(scale,p);
работают по разному, не пойму почему...
То есть? Приведи код и покажи в чем различие.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн vladimir.leontyevАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
.. извиняюсь, мой косяк, setToScaling работает,
разбираюсь сейчас с базовой точкой масштабирования, оказалось не все так просто.
еще раз thanks

Оффлайн vladimir.leontyevАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Всем привет. Есть еще вопрос по теме.
Как задать разный scaling по осям?
Я попробовал:

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

Это вроде работает, но невозможно задать базовую точку, относительно которой производится масштабирование.
Как тут быть? Спасибо
(извиняюсь за неформатированный код)
« Последнее редактирование: 10-01-2023, 19:06:45 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как тут быть?
Первая мысль, которая приходит в голову - сделать три трансформации:
1. Перенос из базовой точки в начало координат.
2. Масштабирование.
3. Перенос в соответствии с новым положением базовой точки с учетом масштабирования.
P.S.: Очень немного примитивов поддерживают масштабирование с разными масштабами по X, Y, Z. Из того, что мне помнится - это AcDbBlockReference и AcDb3dSolid и кажется еще AcDbEllipse. В противном случае transformBy возвращает Acad::eCannotScaleNonUniformly
« Последнее редактирование: 10-01-2023, 23:58:04 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение vladimir.leontyev 16-01-2023, 12:53:55

Оффлайн vladimir.leontyevАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Спасибо за совет, мне это помогло. Я делал scaling после translation, а надо наоборот!