Visio
У меня сложилось впечатление, что в одной компании не очень-то рады тому, что купили в своё время Visio. Это продукт с наиболее дебильной объектной моделью и такими странными ходами, что становится немного не по себе. Моя задача была обеспечить разбор нарисованного пользователем графа и сообщить пользователю о допустимости либо недопустимости выбранной конфигурации.
Эта работа состоит из большого числа полубессмысленных либо сложных и запутанных шагов и всё потому, что платформой для рисования был(о?) выбрано Visio. Для того, чтобы приступить к обходу графа, необходимо:
1. Построить stencil, определив geometries, custom property sets и прочие behaviors. Эти операции не так очевидны, потому мало иметь под рукой Visio SDK. Надо ещё под носом держать постоянно открытый Shapesheet для уточнения того, что соблаговолили написать в SDK. А кроме этого object inspector из VBA от Visio тоже не помешает: определять, к каким перечислениям и классам относятся странноватые константы вроде visRowXForm1D - откуда-то надо.
2. Внутри своего кода (в моём случае это C# 2.0) потребуется выполнять такие многозначительные операции, как получение точек соединения для фигур и отрезков, соединяющих фигуры. Интересно, что коллекции ConnectionPoints нет как класса, а вместо этого предлагается использовать что-то вроде
x = Shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionConnectionPts,
a,
(short)Visio.VisCellIndices.visCnnctX).get_Result(Visio.VisMeasurementSystem.visMSMetric);
y = Shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionConnectionPts,
a,
(short)Visio.VisCellIndices.visCnnctY).get_Result(Visio.VisMeasurementSystem.visMSMetric);
То есть, visio's shape нужно рассматривать как таблицу со строками и полями специального значения. Ну, ладно, бывало и хуже.
3. Оказывается, при повороте вокруг точки вращения Visio не учитывает изменения координат точек соединения. И если я попытаюсь соединить одну фигуру с другой (а признак соединения - совпадение начала или конца отрезка соединения с точкой соединения фигуры) - то мне потребуется самостоятельно выполнять перенос оси координат и поворот. Это, конечно, мелочь, чего там:
double x1 = x*cos - y*sin;
y = x*sin + y*cos;
Почему программисты Visio не стали делать этих вычислений самостоятельно я не могу понять.
В общем, внутренности Visio мне сильно напоминают вид внутренностей козы, которую на закрытии по копытам взял мой товарищ. Маленькая аккуратная дырочка в боку от входа пули и громадный кровавый остропахнущий вывалившийся из противоположного бока козы комок из печени, желудка и кишок. И я думаю, что то, что можно козе - Visio нельзя.