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

  • Автор темы Автор темы tohaa
  • Дата начала Дата начала

tohaa

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

<?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 строки текста на пробел, либо удалить их.
Условия: Текст должен остаться цельным блоком.

Необходимо делать такую чистку очень-очень много раз, и совсем не хочется делать ее руками.
Объясните пожалуйста, киньтесь ссылкой или кодом.
 
Сделать можно, причем элементарно, но что-то мне подсказывает, что вы хотите безумно странного, ибо выбрали для данного действия неправильный инструмент.
Можно поинтересоваться конечной задачей? Может, текст и импортировать в корел не надо?
 
Сделать можно, причем элементарно, но что-то мне подсказывает, что вы хотите безумно странного, ибо выбрали для данного действия неправильный инструмент.
Можно поинтересоваться конечной задачей? Может, текст и импортировать в корел не надо?
Конечно можно) В данном случае стоит задача экономии времени и принцип одного окна. Необходимо видеть одновременно векторное изображение, и код svg, сделанный из этого изображения . Но код нужен очищеный. Без кореловского мусора.
 
Последнее редактирование:
Вы файл построчно читаете?
Ну и игнорируйте первые четыре строки, в чем проблема то? ;)
 
Вы файл построчно читаете?
Ну и игнорируйте первые четыре строки, в чем проблема то? ;)
Файл 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 очень скудные.
Попытки найти и заменить текст в импортированном блоке не увенчались успехом. Могу находить и менять слова, но не скобки " <> /. Удаление строк в текстовом блоке вообще не нашел.
 
Последнее редактирование:
Файл svg импортируется в корел как текст.
Зачем? Вы ж вроде говорили
и принцип одного окна. Необходимо видеть одновременно векторное изображение, и код svg, сделанный из этого изображения
Так вам в окно этот текст нужно или в сам макет?
В любом случае есть свойство Text.Story.Text, куда можно любой текст записывать, в том числе, построчно считанный из файла
А есть и Text.Story.Lines которые очищать при желании можно
Курите хелп
 
Последнее редактирование:
Не надо импортировать -- читайте как текст.
Код:
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
Я в коде записываю строки в массив -- вы можете в текстовый блок сразу.
 
Зачем? Вы ж вроде говорили

Так вам в окно этот текст нужно или в сам макет?
Вот внешний вид, который я хочу получить. Сейчас скрипт обрабатывает макет нужным образом, делает из макета 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 КБ · Просм.: 690
Удалить первую строку текста
Код:
Set t = s.Text
t.Story.Lines.First.Delete
повторять до полного удовлетворения
 
  • Спасибо
Реакции: eugeny
Удалить первую строку текста
Код:
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

Так работает быстрее.
 
Ну, мало ли, вдруг они по какому то странному стечению электронов вперемешку идут? '))'
 
Добрый вечер.
Развивая эту тему и свой код, хочу задать Вам следующий вопрос.

Есть текстовый блок, а точнее код 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>

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

Надеюсь на Вашу помощь)
 
Последнее редактирование:
Там же не во всем тексте, а чисто в блоке.
Не видя обьектной модели с утюга, навскидку примерно так:
1) Создать объект TextRange от начала до нужного места
2) Внутри него производить данную замену. Насколько я помню, VBA регулярные выражения не поддерживает, но костыль для такой замены имеется.
 
str=
2) Внутри него производить данную замену. Насколько я помню, VBA регулярные выражения не поддерживает, но костыль для такой замены имеется.
Костыль типа: если первые 14 символов строки: <rect class="", то удалить их.
к строке <rect class="main" присоединить остаток предыдущей строки.
 
Ну там особо никаких регулярных выражений нет, стандартный метод Replace вполне пойдет.
 
Я не понимаю как заменять спец символы. Они являются синтаксисом Vba и вызывают ошибку при запуске макроса.