[CDR 2023] Как грамотно вытащить объекты из группы.

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Собственно вопрос. как правильно макросом вытащить объекты из группы не разгруппировывая их.
 

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 147
Реакции
2 054
CTRL+X не годится?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
макросом хотелось бы. а через стандартный буфер копи-пейст не лучшее решение внутри кода его использовать.
так то да. руками я Ctrl+X - Ctrl+V и использую
в принципе сейчас я так и делаю. хочется более грамотный способ.

стандартно корел вообще предлагает разгруппировывать.
Shape.ParentGroup property - Developer Area - CorelDRAW Community

Shape.ParentGroup property
Код:
Sub Test()
  Dim s As Shape, g As Shape
  Set s = ActiveShape
  If s Is Nothing Then
    MsgBox "Please select an object", vbCritical
    Exit Sub
  End If
  Set g = s.ParentGroup
  If g Is Nothing Then
    MsgBox "Please select an object within a group", vbCritical
    Exit Sub
  End If
  ActiveDocument.PreserveSelection = False
  g.CreateSelection
  g.Ungroup
  s.Selected = False
  ActiveSelection.Group
  s.CreateSelection
End Sub


Продублировать, а исходный удалить?
если их дублировать то дубли остаются в тех же группах
 

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Продублировать группу остальные удалить
представьте сколько будет работать по времени такой макрос если несколько тысяч объектов? :)
ну совсем не оптимально. проще уж через Ctrl+X работать.
хочется красивого и грамотного решения.
сейчас код вроде простой. но хотелось бы избавиться от копипаста просто.

JavaScript:
srr.Cut();
host.ActiveLayer.Paste();
srr = host.ActiveSelectionRange;
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852
представьте сколько будет работать по времени такой макрос если несколько тысяч объектов? :)
ну совсем не оптимально. проще уж через Ctrl+X работать.
хочется красивого и грамотного решения.
сейчас код вроде простой. но хотелось бы избавиться от копипаста просто.

JavaScript:
srr.Cut();
host.ActiveLayer.Paste();
srr = host.ActiveSelectionRange;
Несколько тысяч обьектов в группе?
 

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Несколько тысяч обьектов в группе?
несколько тысяч групп. хотябы ну и в группах тоже бывает под сотню объектов.
некоторые дизайнеры могут венок нарисовать листиками каждый объект отдельно и все это сгруппировать вместе с текстом.
а потом нужно эти венки вытащить отдельно и т.п.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852
Тут я думаю, идеологическое ограничение. Вот в иллюстраторе можно, потому как там просто меняется родитель обьекта. А у корела группа это такой же шейп, как и рекурсивно вложенные в него шейпы, являющиеся неотьемлемой частью родительского шейпа, поэтому нельзя не деструктивно вытащить один шейп наружу, группа развалится.
 

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
Тут я думаю, идеологическое ограничение. Вот в иллюстраторе можно, потому как там просто меняется родитель обьекта. А у корела группа это такой же шейп, как и рекурсивно вложенные в него шейпы, являющиеся неотьемлемой частью родительского шейпа, поэтому нельзя не деструктивно вытащить один шейп наружу, группа развалится.
да. вероятно так и есть.
даже если записать макрос и руками в списке объектов вытащить объект выше группы. то макрос записанный выглядит ужасно :)
он разгруппировывает и снова сгруппировывает :(
просто для ShapeRange есть свойство Remove
а для шейпа получается нету. так бы можно было из коллекции s.Shapes выкинуть этот объект и он теоретически сам должен был оказаться на одном уровне со своей бывшей группой.. но видимо многого хочу ))
 

Любимцев

15 лет на форуме
Сообщения
4 210
Реакции
2 058
хочется красивого и грамотного решения
Работать в ИЛЛ, не красиво, не грамотно?
Не... я просто предложил :)
Как понимаю, вам же надо просто с вектором работать, а не принципиально в Corel
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 147
Реакции
2 054
М.б. так?
копию группы в shapeRange- объект из shapeRange.remove - shapeRange группируем - оригинал группы удаляем
 
Последнее редактирование:

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 147
Реакции
2 054
Несколько тысяч обьектов в группе?
несколько не несколько, а тысячу запросто - печать с микроэлементами - если никто не озаботился скомбинировать мелочь

1695223216580.png
 

DukereD

макрософил
Топикстартер
Сообщения
462
Реакции
114
М.б. так?
копию группы в shapeRange- объект из shapeRange.remove - shapeRange группируем - оригинал группы удаляем
с Range не получится. т.к. это не объекты а просто список объектов. меняя рендж мы не меняем свойства исходных объектов.
тут нужно именно .shapes менять. похоже нет таких способов стандартно :(
Работать в ИЛЛ, не красиво, не грамотно?
Не... я просто предложил :)
Как понимаю, вам же надо просто с вектором работать, а не принципиально в Corel
я пишу макрос для корела. при чем тут люстра?
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
Невнимательно читал обсуждение, поэтому городил с нуля, вместо того, чтобы воспользоваться болванкой
Код:
Sub ex()
  ActiveDocument.BeginCommandGroup "ex"
  Set sel = ActiveSelectionRange
  Set grp = sel(1).ParentGroup.UngroupEx
  grp.RemoveRange sel
  Set grp = grp.Group
  sel.OrderFrontOf grp
  ActiveDocument.EndCommandGroup
End Sub
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852
Невнимательно читал обсуждение, поэтому городил с нуля, вместо того, чтобы воспользоваться болванкой
Код:
Sub ex()
  ActiveDocument.BeginCommandGroup "ex"
  Set sel = ActiveSelectionRange
  Set grp = sel(1).ParentGroup.UngroupEx
  grp.RemoveRange sel
  Set grp = grp.Group
  sel.OrderFrontOf grp
  ActiveDocument.EndCommandGroup
End Sub
А чем это принципиально отличается от #4?
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
Не сильно отличается. В #4 выделяется один объект, а ТС (как мне показалось) хотел выделять любое кол-во объектов внутри группы и вынимать их. #4 и есть та болванка, которую я не заметил изначально.
 
Последнее редактирование: