[CDR X5-X8] удаление hidden locked SVG data

Статус
Закрыто для дальнейших ответов.

qzmin

Топикстартер
12 лет на форуме
Сообщения
109
Реакции
60
Помогите, пожалуйста, сделать макрос для избавления от скрытых и залоченых объектов SVG data по всему документу, в том числе в группах и поверклипах.

Поиски выдали конструкции:
Код:
ActivePage.Shapes.FindShapes(Query:="@COM.locked = true").Unlock
ActivePage.Shapes.FindShapes(Query:="@COM.visible = false").Show

но моих познаний не хватает, чтобы заставить их обрабатывать группы и поверклипы в различных комбинациях и степенях вложения.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
заставить их обрабатывать группы и поверклипы в различных комбинациях и степенях вложения.
А это и невозможно в общем случае
Буквально на днях была тема здесь - скриптинг принципиально не видит некоторые шейпы в масках и клипах
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
Если только группы и клипы (бывают и другие виды вложения), то примерно так:
Код:
Sub Unlocker()
  On Error Resume Next
  ActiveDocument.BeginCommandGroup "Unlock all"
  Dim p As Page
  For Each p In ActiveDocument.Pages
    P_unlock p.Shapes
  Next p
  ActiveDocument.EndCommandGroup
End Sub

Private Sub P_unlock(sr As Shapes)
    Dim s As Shape
    For Each s In sr
        If s.Type = cdrGroupShape Then P_unlock s.Shapes
        If Not s.PowerClip Is Nothing Then P_unlock s.PowerClip.Shapes
    Next s
    sr.FindShapes(Query:="@COM.locked = true").Unlock
    sr.FindShapes(Query:="@COM.visible = false").Show
End Sub
 
  • Спасибо
Реакции: qzmin

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Тьфу черт, совсем у меня от температуры мозги расплавились - думал тема про иллюстратор! ;)
 

qzmin

Топикстартер
12 лет на форуме
Сообщения
109
Реакции
60
lev, всё прекрасно показывает и разлочивает.
а как теперь удалить эти объекты?
Код:
sr.FindShapes(Query:="@type = 'хрень'").Delete ?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
По идее да
А type тут при чем?
 

qzmin

Топикстартер
12 лет на форуме
Сообщения
109
Реакции
60
_MBK_, просто sr.FindShapes.Delete удаляет объект наиглубше вложенный/загруппированный
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
То есть всю группу?
А разве можно выборочно заблокировать один объект в группе, не блокируя ее целиком?
 

qzmin

Топикстартер
12 лет на форуме
Сообщения
109
Реакции
60
вот что делает скрипт
svg.gif
думаю вполне возможна и обратка
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Так я не понял - вам надо что - SVG дата удалить целиком или только невидимые-заблокированные?
 

qzmin

Топикстартер
12 лет на форуме
Сообщения
109
Реакции
60
конечная цель — удалить все объекты SVG data (что и было написано в начале).
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
А скопом и не получится
Вы обратили внимание, что за массив возвращает sr.FindShapes(...)? Там, по странному капризу канадских индусов, все шейпы, находящиеся в сожительстве с найденными. В Львином макросе работает только потому, что все сопутствующие объекты тоже видимы и разлочены
Нужно брать все шейпы на странице и перебирать их в цикле, проверяя на тип
Иначе никак
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
конечная цель — удалить все объекты SVG data (что и было написано в начале).
В начале было написано удалить только скрытые и залоченные. На Вашем скрине присутствуют и нескрытые разлоченные SVG data.
Если нужно удалять все SVG data, я бы попробовал удалять шейпы по имени, а не типу и т.п.
Вы бы лучше небольшой подопытный файлик приложили, чтобы самому тесты не городить, время не тратить.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
По любому одной командой FindShapes это не реализуется
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
По идее, корректным является следующий код
Код:
Sub Remover()
  On Error Resume Next
  ActiveDocument.BeginCommandGroup "Remove SVG data"
  Dim p As Page
  For Each p In ActiveDocument.Pages
    P_unlock p.Shapes
  Next p
  ActiveDocument.EndCommandGroup
End Sub

Private Sub P_unlock(sr As Shapes)
    Dim s As Shape
    For i = sr.Count To 1 Step -1
        Set s = sr.Item(i)
        If s.Type = cdrGroupShape Then P_unlock s.Shapes
        If Not s.PowerClip Is Nothing Then P_unlock s.PowerClip.Shapes
        If s.Type = cdrNoneShape Then
        
          s.Locked = False
          s.Delete
        End If
    Next i
  
End Sub
И этот код работает, правда, по непонятной причине, с первого раза все объекты не удаляет, нужно прогонять повторно. 'hmmm'
 
  • Спасибо
Реакции: qzmin

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
Интернеты для избавления от "SVG data" посоветовали сохранение в *.cmx. На тесте сработало. Можно и другие форматы попробовать.
Если у Вас многостраничник, или хочется одной кнопкой, то можно автоматизировать постраничный экспорт-реимпорт
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
А что думаешь по поводу
опечатка в cdrNoneShape (не влияющая)
Стоит не удалять сразу, а собрать в коллекцию для последующего удаления сразу всех, тогда можно ещё и не заморачиваться с обратным циклом
Код:
Dim ss As New ShapeRange
Sub Remover()
    On Error Resume Next
    ActiveDocument.BeginCommandGroup "Remove SVG data"
    Dim p As Page
    For Each p In ActiveDocument.Pages
        P_unlock p.Shapes
    Next p
    ss.Delete
    ActiveDocument.EndCommandGroup
End Sub

Private Sub P_unlock(sr As Shapes)
    Dim s As Shape
    For Each s In sr
        If s.Type = cdrGroupShape Then P_unlock s.Shapes
        If Not s.PowerClip Is Nothing Then P_unlock s.PowerClip.Shapes
        If s.Type = cdrNoShape Then
            s.Locked = False
            ss.Add s
        End If
    Next
End Sub
Код оставляет невидимые или залоченные объекты не являющиеся "SVG data" (я уже запутался, как нужно ТС, можно добавить в код и их удаление), а cmx фокусы гробят их сразу.
 
  • Спасибо
Реакции: qzmin и _MBK_
Статус
Закрыто для дальнейших ответов.