All Forums
 Категория Visio
 Форум Вопросы и ответы
 Изменение размера отдельного шейрп в группе
Author Previous Topic Topic Next Topic  

alla

3 Posts

Posted - 02/21/2007 :  16:35:23
Подскажите, как решить такую проблему. Деталь состоит из многих частей, это сгруппировано, у какой-то части в середине надо изменить размер - чтобы все остальное не меняло размера, но оставалось рядом - просто сдвигалось.

mers

Russia
159 Posts

Posted - 02/21/2007 :  17:01:09
програмно или ручками?
Go to Top of Page

alla

3 Posts

Posted - 02/22/2007 :  13:51:25
Желательно ручками, но можно и программно. Я смотрела программно, но я пробовала делать только простые вещи и не особо знаю...
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/24/2007 :  09:19:50
Задача описана в слишком общем виде... Может я не так понял...
В простейшем случае можно попробовать "привязать" шейпы за счет формул шейп-листа.
Например, если на листе (группировка в данном случае не важна) имеется три шейпа Sheet.1, Sheet.2 и Sheet.1, расположенные слева направо, то можно:
- в ячейку PinX шейпа Sheet.2 ввести формулу =Guard(Sheet.1!PinX+Sheet.1!Width/2+Width/2)
- в ячейку PinX шейпа Sheet.3 ввести формулу =Guard(Sheet.2!PinX+Sheet.2!Width/2+Width/2)
Если теперь менять ширину любого шейпа, то другие будут сдвигаться (но только по горизонтали).
Естественно, цепочка может включать больше шейпов.
По координате Y в формуле будет присутствовать Height вместо Width.
Смысл в том, чтобы описать каждому следующему шейпу, куда ему двигаться при изменении местоположения или размера предыдущего шейпа.
Такой способ Вам не подходит?
Go to Top of Page

alla

3 Posts

Posted - 02/26/2007 :  17:25:37
Спасибо. На простом примере - несколько фигур, у меня вышло, работает хорошо, но у меня сложная деталь. И потом - она уже есть нарисованая, и много мелких деталей. А нельзя определенные части просто "склеить"?
Go to Top of Page

mers

Russia
159 Posts

Posted - 02/28/2007 :  12:33:31
При большом количестве шейпов можно создать небольшой скриптик.
// 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 Объектов.

Ну как-то так.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)