[CDR X5-X8] Макрос замены строки текста или удаления строки.

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Добрый день. Есть импортированный в корел текст примерно такого вида:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW -->
<svg xmlns="SVG namespace" xml:space="preserve" width="208.339mm" height="147.234mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 20834 14723"
xmlns:xlink="XLink namespace">
<defs>
<style type="text/css">
<![CDATA[
.str0 {stroke:#2B2A29;stroke-width:20}
.fil0 {fill:none}
]]>
</style>
</defs>
<g id="main">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="fil0 str0" x="10" y="7648" width="10630" height="7065"/>
</g>

Задача: Найти и заменить первые 4 строки текста на пробел, либо удалить их.
Условия: Текст должен остаться цельным блоком.

Необходимо делать такую чистку очень-очень много раз, и совсем не хочется делать ее руками.
Объясните пожалуйста, киньтесь ссылкой или кодом.
 

_MBK_

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

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Сделать можно, причем элементарно, но что-то мне подсказывает, что вы хотите безумно странного, ибо выбрали для данного действия неправильный инструмент.
Можно поинтересоваться конечной задачей? Может, текст и импортировать в корел не надо?
Конечно можно) В данном случае стоит задача экономии времени и принцип одного окна. Необходимо видеть одновременно векторное изображение, и код svg, сделанный из этого изображения . Но код нужен очищеный. Без кореловского мусора.
 
Последнее редактирование:

_MBK_

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

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Вы файл построчно читаете?
Ну и игнорируйте первые четыре строки, в чем проблема то? ;)
Файл svg импортируется в корел как текст.
вот кусочек отвечающий за импорт.
Dim impopt As StructImportOptions
Set impopt = CreateStructImportOptions
With impopt
.MaintainLayers = True
.TextFormatting = cdrImportNoFormatting
.ForceCMYKBlackText = True
.ConvertTablesToText = False
With .ColorConversionOptions
.SourceColorProfileList = "sRGB IEC61966-2.1,ISO Coated v2 (ECI),Dot Gain 15%"
.TargetColorProfileList = "sRGB IEC61966-2.1,ISO Coated v2 (ECI),Dot Gain 15%"
End With
End With
Dim impflt As ImportFilter
Set impflt = ActiveLayer.ImportEx(Path & Name & ".svg", cdrTXT, impopt)
impflt.Finish

Мои познания в corel vba очень скудные.
Попытки найти и заменить текст в импортированном блоке не увенчались успехом. Могу находить и менять слова, но не скобки " <> /. Удаление строк в текстовом блоке вообще не нашел.
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Файл svg импортируется в корел как текст.
Зачем? Вы ж вроде говорили
и принцип одного окна. Необходимо видеть одновременно векторное изображение, и код svg, сделанный из этого изображения
Так вам в окно этот текст нужно или в сам макет?
В любом случае есть свойство Text.Story.Text, куда можно любой текст записывать, в том числе, построчно считанный из файла
А есть и Text.Story.Lines которые очищать при желании можно
Курите хелп
 
Последнее редактирование:

eugeny

15 лет на форуме
Сообщения
859
Реакции
210
Не надо импортировать -- читайте как текст.
Код:
Open putfileOdp For Input As #1
r = 0
    Do Until EOF(1)
    Line Input #1, Data
    ReDim Preserve odp(r)
        odp(r) = Data
        r = r + 1
    Loop
    Close #1
Я в коде записываю строки в массив -- вы можете в текстовый блок сразу.
 

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Зачем? Вы ж вроде говорили

Так вам в окно этот текст нужно или в сам макет?
Вот внешний вид, который я хочу получить. Сейчас скрипт обрабатывает макет нужным образом, делает из макета svg с тем же именем, а дальше импортирует svg как текст. Этот текст мне и нужно очистить. На этом обработка файла будет завершена.
upload_2018-9-21_10-52-57.png

Спасибо за направление. Буду читать хелп.
 

Вложения

  • upload_2018-9-21_10-52-31.png
    upload_2018-9-21_10-52-31.png
    381.6 КБ · Просм.: 658

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Удалить первую строку текста
Код:
Set t = s.Text
t.Story.Lines.First.Delete
повторять до полного удовлетворения
 
  • Спасибо
Реакции: eugeny

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Удалить первую строку текста
Код:
Set t = s.Text
t.Story.Lines.First.Delete
повторять до полного удовлетворения
Спасибо за подсказку.

Dim s As Shape
For Each s In ActiveLayer.Shapes.FindShapes(Type:=cdrTextShape)
s.text.Story.Lines.Item(1, 4).Delete
Next s

Так работает быстрее.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну, мало ли, вдруг они по какому то странному стечению электронов вперемешку идут? '))'
 

tohaa

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

Есть текстовый блок, а точнее код svg, вставленный на страницу корел.

Выглядит он приблизительно так:
<svg xmlns=****>
<g id="main">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="" x="118" y="118" width="58964" height="41478"/>
<rect class="" x="11" y="18" width="5864" height="43478"/>
</g>
<g id="print1">
<metadata id="CorelCorpID_1Corel-Layer"/>
<rect class="" x="4388" y="9674" width="10980" height="6710"/>
</g>
<g id="print2">
<metadata id="CorelCorpID_2Corel-Layer"/>
<rect class="" x="8149" y="12826" width="13724" height="10878"/>
</g>
<g id="print3">
<metadata id="CorelCorpID_3Corel-Layer"/>
<rect class="" x="18417" y="12927" width="8031" height="35582"/>
</g>
</svg>

Задача: Заменить текст только в части текста. А именно в части текста, начинающийся с

<g id="main">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="" x="118" y="118" width="58964" height="41478"/>
<rect class="" x="11" y="18" width="5864" height="43478"/>
</g>

заменить значения class="" на class="main" чтобы получилось
<g id="main">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="main" x="118" y="118" width="58964" height="41478"/>
<rect class="main" x="11" y="18" width="5864" height="43478"/>
</g>

Кол-во строк для замены в каждом случае разное. Все строки ниже этого блока менять не нужно.

Надеюсь на Вашу помощь)
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Там же не во всем тексте, а чисто в блоке.
Не видя обьектной модели с утюга, навскидку примерно так:
1) Создать объект TextRange от начала до нужного места
2) Внутри него производить данную замену. Насколько я помню, VBA регулярные выражения не поддерживает, но костыль для такой замены имеется.
 

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 145
Реакции
2 043

eugeny

15 лет на форуме
Сообщения
859
Реакции
210
str=
2) Внутри него производить данную замену. Насколько я помню, VBA регулярные выражения не поддерживает, но костыль для такой замены имеется.
Костыль типа: если первые 14 символов строки: <rect class="", то удалить их.
к строке <rect class="main" присоединить остаток предыдущей строки.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну там особо никаких регулярных выражений нет, стандартный метод Replace вполне пойдет.
 

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Я не понимаю как заменять спец символы. Они являются синтаксисом Vba и вызывают ошибку при запуске макроса.