суббота, марта 25, 2006

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 нельзя.

3 комментария:

Анонимный комментирует...

Да, Visio всегда славился странностями. Вплоть до того, что он сам у себя в рабочей папке удалял пустые подпапки и потом отказывался запускаться :).
А про внутренности вообще страшно говорить - там что-то страшное :).

Das Ich комментирует...

За время, прошедшее с покупки, могли бы уже его и переписать.

Анонимный комментирует...

Уж точно! Но они этим наверное никогда не займутся.
С другой стороны если бы они его писали сами еще не понятно что бы они нагородили.