[CDR 2017-2021] Добавление одной группы в другие.

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Добрый день.
В документе есть какое-то случайное количество сгруппированых объектов и одна группа объектов, имеющая имя.
Каким образом сгруппировать группу с именем с каждой группой?
чтобы получилось так:
1.группа с именем + группа из документа
2.группа с именем + группа из документа
3.группа с именем + группа из документа

С помощью ActiveLayer.FindShapes (Name:="crop", Type:=cdrGroupShape, recursive:=False) нахожу в документе группу с именем, но как найти все остальные группы и перегруппировать их - не понимаю.
 

DukereD

макрософил
Сообщения
482
Реакции
116
Добрый день.
В документе есть какое-то случайное количество сгруппированых объектов и одна группа объектов, имеющая имя.
Каким образом сгруппировать группу с именем с каждой группой?
чтобы получилось так:
1.группа с именем + группа из документа
2.группа с именем + группа из документа
3.группа с именем + группа из документа

С помощью ActiveLayer.FindShapes (Name:="crop", Type:=cdrGroupShape, recursive:=False) нахожу в документе группу с именем, но как найти все остальные группы и перегруппировать их - не понимаю.
перегруппировать просто так не получится.
надо разгруппировывать старую группу. добавлять в нее объекты и заново группировать. ну и не забыть заново имя новой группе присвоить т.к. при разгруппировке оно потеряется.
 

DukereD

макрософил
Сообщения
482
Реакции
116
Но вообще не понятен смысл задачи. вы уже почти решение предлагаете, а лучше для задачи писать абстрактное описание того что есть и что нужно получить. возможно вы не с того конца к решению задач подходите
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 359
Реакции
10 886
Более того, безымянные группы ж придется дублировать
 

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
перегруппировать просто так не получится.
надо разгруппировывать старую группу. добавлять в нее объекты и заново группировать. ну и не забыть заново имя новой группе присвоить т.к. при разгруппировке оно потеряется.
Мне нужен аналог ручного выбора двух групп в менеджере объектов и группировки их между собой. Но не могу понять как перебрать все существующие в документе группы.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 359
Реакции
10 886
Мне нужен аналог ручного выбора двух групп в менеджере объектов и группировки их между собой. Нотнемогу понять как перебрать все существующие в документе группы.
А так вам нужна группа из двух групп?
 

DukereD

макрософил
Сообщения
482
Реакции
116
Мне нужен аналог ручного выбора двух групп в менеджере объектов и группировки их между собой. Нотнемогу понять как перебрать все существующие в документе группы.
ну так вы выборку FindShapes сделали в результате и бегите по ним циклом
for each s in FindShapes
 

DukereD

макрософил
Сообщения
482
Реакции
116

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Взять первую группу из всех групп
Выделить ее.
Добавить группу с именем к выделению.
Сгруппировать их.
Перейти к следующей группе
 

DukereD

макрософил
Сообщения
482
Реакции
116
Взять первую группу из всех групп
Выделить ее.
Добавить группу с именем к выделению.
Сгруппировать их.
Перейти к следующей группе
ну не совсем ясен принцип нахождения пар. ну да ладно.
смысл такой, что надо сделать 2 выборки.
одна группы у которых есть имена и вторая группы у которых нет имен.
и слеловательно "бежать" по выборке, где нет имён и нужное имя по очереди группировать в новые группы (разгруппировывать старые или нет это уже как вам нужно)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 359
Реакции
10 886
Взять первую группу из всех групп
Без разницы по какому признаку первую?

Добавить группу с именем
С каким именем? Вы же говорите что с именем группа одна? Если так, то о каком следующем шаге может быть речь, группы с именем закончатся на первом
 
  • Смешно
Реакции: DukereD

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Без разницы по какому признаку первую?


С каким именем? Вы же говорите что с именем группа одна? Если так, то о каком следующем шаге может быть речь, группы с именем закончатся на первом
Имя есть только у одной группы. Эта группа должна быть скопирована и сгруппирована со всеми другими группами.
 

DukereD

макрософил
Сообщения
482
Реакции
116
Имя есть только у одной группы. Эта группа должна быть скопирована и сгруппирована со всеми другими группами.
аа... так вам одна группа нужна чтобы ее размножить добавить к остальным ))
пользуйтесь моим макросм он это умеет.
и разбросать по объектам и добавить в группы (по касанию)
 

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
аа... так вам одна группа нужна чтобы ее размножить добавить к остальным ))
пользуйтесь моим макросм он это умеет.
и разбросать по объектам и добавить в группы (по касанию)
С удовольствием почитаю ваш код. Дадите?
 

DukereD

макрософил
Сообщения
482
Реакции
116
С удовольствием почитаю ваш код. Дадите?
код в макросе открытый.
но там подход немного другой
раскидыватель понятно как работает. просто берет последний объект и дублирует по координатам всех остальных.
а вот поиск касаний (один и тот же алгоритм для автогрупиировки и для добавления)сверяем объекты каждый с каждым. смотрим пересекаются ли их координаты. если пересекаются - добавляем в массив. формируем потом массив всех взаимопересечений и кто с кем пересекается формируем один шейпрендж, который потом и группиируем. и переходим к следующим взаимно пересекающимся объеками

код на VBA в старой версии панели
в новом докере код переписан на JS (старую версию докера бесплатно можно скачать в ресурсах)
вместо того чтобы пробегаться сто раз (вложено) каждый с каждым. быстрее загнать значения в массив и уже по массивам бегать. и потом просто по индексам массива вытягивать нужные объекты.
в JS это работает вообще очень быстро .
 
  • Спасибо
Реакции: tohaa

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Сделал кривое, но рабочее.
1.Нашел на активном слое группу с именем MY
2. вырезал ее в буфер обмена
3. перебрал оставшиеся на странице объекты в поиске групп
4. в найденную группу вставил из буфера
5. сгруппировал.


Код:
Dim sr As ShapeRange, s As Shape

Set cr = ActiveLayer.FindShapes(Name:="my", Type:=cdrGroupShape, recursive:=False)
cr.Cut

Set sr = ActivePage.ActiveLayer.Shapes.All

For Each s In sr
If s.Type = cdrGroupShape Then
ActiveLayer.Paste
s.AddToSelection
ActiveSelection.Group
End If
Next