Всем привет. Конечно в меня полетят тухлые помидоры от Ривилиса, но придется потерпеть
Касаемо матриц трансформации у меня дикое непонимание темы ((
В
этой теме я выкладывал тестовый проект. Вот с ним же и продолжим разбираться (я его приложил к этой теме). В этом проекте для блока задаются две ручки. Первая равна точке вставки блока, а вторая создает геометрию.
Для контроля положения второй точки я использовал расширенные данные, которые хранят вектор между второй точкой и первой. Т.е. при получении ручек берется точка вставки блока и к ней прибавляется этот вектор - получаем вторую точку. В
той теме есть видео примеры в которых видно, что это работает. Но это работает до тех пор, пока я не трансформирую сам блок - поверну, масштабирую или отзеркалю (перемещение не играет роли в данном случае) - тогда вторая точка не соответствует требуемому положению.
При получении расширенных данных из блока работает следующий метод:
public void GetParametersFromResBuf(ResultBuffer resBuf)
{
TypedValue[] resBufArr = resBuf.AsArray();
foreach (TypedValue typedValue in resBufArr)
{
switch ((DxfCode)typedValue.TypeCode)
{
case DxfCode.ExtendedDataAsciiString:
{
Vector3d vectorFromEndToStart = SimplyEntityHelper.ConvertStringToVector3d(typedValue.Value.ToString());
var pt = StartPoint + vectorFromEndToStart;
EndPoint = pt;
break;
}
}
}
}
Это как раз получение второй точки по вектору. Как я предполагаю - эту точку нужно еще трансформировать в зависимости от трансформации блока. У меня получалось учесть масштаб и поворот, используя свойства ScaleX и Rotation из блока. Но я застрял с отзеркаливанием. Поэтому я предположил, что можно взять значение BlockTransform из вхождения блока и трансформировать точку:
EndPoint = pt.TransformBy(BlockTransform);
Но мои предположения оказались неверными.
Прошу помощи с идеями и подсказками