При большом количестве шейпов можно создать небольшой скриптик.
// C# code.
// Переменная mainShape - это ссылка на "большой" шейп - деталь.
// Получение количества "маленьких" шейпов - частей детали.
// Коллекция Shapes у главного шейпа, это коллекция шейпов из которых он состоит.
int count = mainShape.Shapes.Count;
// Объявление вспомогательной переменной.
Visio.Shape subShape = null;
// Перебор все шейпов из которых состоит деталь.
for(int i = 1; i <= count; i++)
{
// Здесь нужно прописать в каждый из шейпов - частей детали формулы указанные выше.
// Как это должно быть, сразу не скажу, нужно подумать.
// Но что-то вроде такого:
// Получение ссылки на шейп - часть детали.
subShape = mainShape.Shapes[i];
// Получение ссылки на следующий шейп в коллекции.
Visio.Shape tempShape = null;
if(i != count)
tempShape = mainShape.Shapes[i+1];
if(tempShape == null)
return;
// Формирование формул.
// Здесь может быть проблема с именем, т.е. нужно посмотреть какое свойство взять чтобы Visio мог засунуть его в формулу.
// Недавно у меня была такая проблема, посмотрите топики чуть ранее.
// У меня решилось использованием свойства NameID.
string name = tempShape.Name;
// Сдвиг по горизонтали в случае изменения размера других шейпов.
string formulaX = "Guard(" + name + "!PinX+" + name + "!Width/2+Width/2)";
string formulaY = "Guard(" + name + "!PinY+" + name + "!Height/2+Height/2)";
// Прописываем эти формулы в ячейки таблицы шейпа.
subShape.get_Cells("PinX").Formula = formulaX;
subShape.get_Cells("PinY").Formula = formulaY;
}
Как это будет на встроеном в Visio бейсике нужно посмотреть, там не сложно.
Главное идея: Перебираем все шейпы - части детали у главного шейпа и прописываем в их ячейки PinX и PinY необходимые формулы. Как эти формулы будут выглядеть, нужно подумать, сразу не соображу, необходимо пробовать.
Кроме этого можете записать макрос для вышепреведенного примера с тремя шейпами. Посмотрите листинг созданной Visio программы и доработайте ее для случая N Объектов.
Ну как-то так.