Небольшая статейка о том, как сделать, чтобы при отзеркаливание параметрического объекта СПДС не зеркалился текст прописаный в геометрии объекта (UText)
Ответ прост - никак
Даже если вы создадите для объекта вид сзади, который будет зеркален виду спереди, текст в геометрии себя будет вести неадекватно
https://forum.nanocad.ru/uploads/monthly_2020_06/MTEvOQA2R8.gif.68f408b1dec328edf836e0ec9e5b7957.gif.a4092fee4615478628e2fdad6887cc4f.gif
Тогда что же делать?
Во-первых, мы не будем создавать вид сзади. Мы заставим объект отзеркалиться обратно!
Что нам для этого надо:
1. Заставить объект понимать, что он отзеркален.
2. Заставить объект, если он отзеркален, зеркалить себя обратно.
3. Заставить объект переместить себя на нужное место.
Решаем первую задачу
Мой объект - https://forum.nanocad.ru/applications/core/interface/file/attachment.php?id=16114
Вводим две переменные в объект:
rAngleX (назовём её "Угол X") и rAngleY (назовём её "Угол Y")
для переменной "Угол X" вычисляем угол между глобальной осью oY и вектором нашего объекта vecDirection
rAngleX = angleTwoPi(oY,vecDirection);
Для "Угол Y" вычисляем угол между осью oY и вектором нашего объекта vecPlane
rAngleY = angleTwoPi(oY,vecPlane);
Создаём функцию MirrorObject вначале нашего кода и прописываем там наши формулы
function MirrorObject { rAngleX = angleTwoPi(oY,vecDirection); rAngleY = angleTwoPi(oY,vecPlane); }
Прописываем нашу функцию в функциях OnInitialization, чтобы инициализировать при вставке объекта наши переменные, и в OnMakeParameters, что при обновление объекта с помощью команды SPREGENSTD наши параметры обновились (на видео я запускаю эту команду через кнопку)
https://forum.nanocad.ru/uploads/monthly_2020_06/l5eOYW4bO4.mp4.accd8ec83c5534a5b70f4a00b8bdefaa.mp4
Из видео видно, что если мы зеркалим объект по оси Y то
Угол X = 90
Угол Y = 0
А если по X, то
Угол X = 270
Угол Y = 180
С первой задачей мы справились, наш объект понимает, что он отзеркален. Переходим ко второму пункту.
Тут всё просто, на самом деле)
Прописываем iff'ы, которые при определённых значения rAngleX и rAngleY будут разворачивать наш объект
И загоняем их в нашу функцию MirrorObject
Рассмотрим момент, когда мы зеркалим по оси Y.
Что происходит в этот момент с объектом?
У него меняется направления вектора vecDirection. Значит, чтобы отзеркалить объект обратно, нам надо для начала поменять направления вектора vecDirection!
пишем:
if(rAngleX==90 && rAngleY==0) { vecDirection = -vecDirection; }
А при зеркале по оси X меняется направление vecPlane, как следствие:
if(rAngleX==270 && rAngleY==180) { vecPlane= -vecPlane; }
Загоняем это в нашу функцию
function MirrorObject { rAngleX = angleTwoPi(oY,vecDirection); rAngleY = angleTwoPi(oY,vecPlane); if(rAngleX==90 && rAngleY==0) { vecDirection = -vecDirection; } if(rAngleX==270 && rAngleY==180) { vecPlane= -vecPlane; } }
Сохраняем объект и обновляем его на чертеже
https://forum.nanocad.ru/uploads/monthly_2020_06/KhJyqVg1fD.mp4.a75d06606fd6ec183366d37ee5b16087.mp4
О чудо, всё заработало!)
Но ещё рано радоваться, проверяем разные случаи и получаем:
https://forum.nanocad.ru/uploads/monthly_2020_06/FKSJA7Pxjj.mp4.b2b053cca7f6d509e5195cf6fb0a80ad.mp4
Логика та же, что и раньше, дописываем iff'ы исходя из угла)
function MirrorObject { rAngleY = angleTwoPi(oY,vecPlane); rAngleX = angleTwoPi(oY,vecDirection); if(rAngleX==90 && rAngleY==0) { vecDirection=-vecDirection; } if(rAngleX==270 && rAngleY==180) { vecPlane=-vecPlane; } if(rAngleX==0 && rAngleY==270) { vecDirection=-vecDirection; } if(rAngleX==180 && rAngleY==90) { vecPlane=-vecPlane; } }
Запись специально не упрощал, но вы можете, если хотите, объединить через "или" (||) часть кода)
Проверяем результат:
https://forum.nanocad.ru/uploads/monthly_2020_06/GjLi1WoHEc.mp4.200b564f2bb95668ab9cd2099c4b1854.mp4
Текст не зеркалится, но крутится.
Чтобы решить эту проблему, надо ввести переменную, отвечающую за поворот текста.
В ActHeader в Public дописываем переменную
sTextAngle, "hidden"
я её скрыл, потому что вручную менять не планирую, если хотите, можете оставить открытой.
А коде исполнения UText дополняем переменной нашего угла:
UText(mp, DegToRad(sTextAngle), 2.5*rSymScl/rScl, 0, 0.0000, T, 1,1);
Я буду работать с углом в градусах
Далее мы определяем в каких значения Угла X и Угла Y у нас текст повёрнут и выставляем для этого случая нужное нам значение sTextAngle, тем самым формирую итоговый вид нашей функции:
function MirrorObject { rAngleY = angleTwoPi(oY,vecPlane); rAngleX = angleTwoPi(oY,vecDirection); if(rAngleX==90 && rAngleY==0) { vecDirection=-vecDirection; } if(rAngleX==270 && rAngleY==180) { vecPlane=-vecPlane; } if(rAngleX==0 && rAngleY==270) { vecDirection=-vecDirection; } if(rAngleX==180 && rAngleY==90) { vecPlane=-vecPlane; } if(rAngleY==180 || rAngleY==270) { sTextAngle=180; } else { sTextAngle=0; } }
Сохраняем и обновляем наши объекты:
https://forum.nanocad.ru/uploads/monthly_2020_06/RWITQ51t9p.mp4.508d1ab146e6c719eb00b9e12a2402d2.mp4
Собственно на этом и всё)
Третий пункт нашей задачи нам не понадобился, так как точка вставки объекта находится по его центру.
Если же точка вставки объекта находилась у края объекта, то нам пришлось бы кроме отзеркаливания объекта обратно в коде, прописывать дополнительно смещения объекта.
Проведу часть такого кода из своего другого объекта, чтобы было понятна логика действия:
anY = angleTwoPi(oY,vecPlane); anX = angleTwoPi(oY,vecDirection); pnt1x = pntOrigin:x; pnt1y = pntOrigin:y; if (anX==180 && anY==90) { pntOrigin:x = pnt1x - L; vecPlane=-vecPlane; } if (anX==90 && anY==0) { pntOrigin:x = pnt1x - B; vecDirection=-vecDirection; }
Примеры моих объектов, с применение данной логики для отзеркаливания:
Плита перекрытия ПБ - https://forum.nanocad.ru/uploads/monthly_2020_06/jhU3CKcAvU.mp4.5ecbc9bc1acde218727930d2294a75c2.mp4
Монолитный участок - https://forum.nanocad.ru/uploads/monthly_2020_06/ntvoxuB7Tf.mp4.04cdc3faec5c6f4a7421ec2a7780f42c.mp4
P.S. Как и в предыдущих случаях, этот же текст, только оформленный благодоря возможностям сайты можно посмотреть на форуме нанокада в моём блоге по ссылке: https://forum.nanocad.ru/index.php?/blogs/entry/9-otzerkalivanie-teksta-v-parametricheskom-obekte-modul-spds/