Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/56: Рейтинг темы: голосов - 56, средняя оценка - 4.50
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54

Поиск координат узлов кривых в Corel Draw 12

24.06.2014, 10:24. Показов 11134. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. В результатах поиска нужной информации не нашел и решил создать новую тему. Надеюсь, что сделаю всё правильно и не повторюсь.
Ситуация следующая. Есть кривая с большим и произвольно изменяющимся количеством узлов. Нужно узнать координаты первого и последнего узла, чтобы записать их в переменные для осуществления с ними дальнейших действий.
На VBA я новичок.

Добавлено через 23 часа 23 минуты
Никто с Corel не пересекался? Можно не обязательно с 12-м, там VBA вроде не сильно меняется от версии к версии. Или нужна дополнительная информация?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2014, 10:24
Ответы с готовыми решениями:

Corel draw x6
Всем привет Переустановил одинаковую винду себе и подруге (семерку 64-тную) и теперь при попытке запуска корела он выдает ошибку и...

Вылетает Corel Draw X5.
Ось XP. При чем на одной машине работает нормально, а на другой вылетает без сообщений об ошибках и т.п. 100% вылетает при нажатии на...

Corel DRAW 12 не работает
я не знаю в какой раздел писать эту тему, проблема в том что когда я открываю корел драв он не реагирует не на что? не создать не открыть...

40
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 11:05
С Corel, в смысле его VBA-надстроек, никто не пересекался (там вообще мало кто знает о макросах).

Есть пример для Word — возможно, там адресация узлов (с помощью VBA) аналогична:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub GramPlus() 'Создана 15.12.2009 и рисует в документе заливаемых «ёжиков»'
N = 35 'Вообще срабатывает лишь при нечётном N > 4.'
 
    With ActiveDocument.Shapes.BuildFreeform(msoEditingAuto, x(1), y(1))
        For k = 2 To N / (2 - N Mod 2)
        .AddNodes msoSegmentLine, msoEditingAuto, x(k), y(k)
        Next k
        .AddNodes msoSegmentLine, msoEditingAuto, x(1), y(1)    'замыкание контура'
        .ConvertToShape.Select
    End With
End Sub
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
24.06.2014, 11:12  [ТС]
Немного не то. Сейчас скину кусочек кода с пояснениями.
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 11:32
Попробуйте. Но диалог будет продуктивен лишь с имеющим Corel.

Предлагаю сформулировать задачу без привязки к конкретному ВБА-приложению.

Выше код неработающий; теперь нашёл готовый проект (там, по F6, типичная работа с узловыми линиями):
Вложения
Тип файла: doc раскидай.doc (56.5 Кб, 9 просмотров)
1
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
24.06.2014, 11:40  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub macro2()
    Dim X1, Xn, Y1, Yn As Integer
    'рисуется кривая (в моём случае - уже есть)
    Dim crv1 As Curve
    Set crv1 = ActiveDocument.CreateCurve()
    With crv.CreateSubPath(0.704543, 8.65226) 'координаты первого узла первой кривой (x1, y1)
        .AppendLineSegment 2.281661, 8.505551
        .AppendLineSegment 3.950472, 7.735331 'координаты последнего узла (скобки не нужны)
    End With
    'рисуется вторая кривая
    Dim crv2 As Curve
    With crv.CreateSubPath(4.775709, 7.038465)
        .AppendLineSegment 6.261134, 5.644732
        .AppendLineSegment 6.866307, 4.581094 'координаты последнего узла второй кривой Xn, Yn
    End With
    'участок кода, который не могу создать, и о котором спрашиваю
    'рисуется прямая с координатами начала и конца (X1, Y1, Xn, Yn)
    Dim s1 As Shape
    Set s1 = ActiveLayer.CreateLineSegment(X1, Y1, Xn, Yn)
End Sub
Как-то так. Как правильно сформулировать без привязки к приложению... Постараюсь.
За пример спасибо, изучу. Просто обновление идёт с задержкой.
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 11:49
Действительно! 0 просмотров для раскидай.doc! И это через 15 минут после просмотра:
Цитата Сообщение от shm2013 Посмотреть сообщение
А файл я скачал
По вашему примеру видно, что коды не взаимозаменяемы; вот вордовский синтаксис:
Visual Basic
1
2
3
4
5
6
With Selection.ShapeRange.Fill
    .Parent.Nodes.Delete 1             'удаление узла № 1 (стартового)
    .Visible = msoTrue                 'видимость заливки (видна)
    .Solid                             'характер заливки (сплошная)
    .ForeColor.RGB = RGB(255, 0, 255)  'заливка контура (цвет по RGB)
End With
Повторяю: нужен обладатель (и знаток) именно Корела!
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
24.06.2014, 13:15  [ТС]
Эти параметры указываются после End With. А файл я скачал.

Добавлено через 1 час 23 минуты
Может подскажете какой-нибудь форум, где можно найти помощь по данной теме?
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 14:00
Это против правил. Все мэтры здесь!
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
24.06.2014, 14:29  [ТС]
Тогда буду пытаться сам. Если найду решение - напишу.

Добавлено через 17 минут
Хотя уже вторую неделю вожусь.

Добавлено через 8 минут
И сформулировал задачу в общей формулировке, без привязки к VBA-приложению. Надо озвучивать?
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 20:38
Как вам угодно. Тема ваша.
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
25.06.2014, 10:04  [ТС]
В общем случае задачу можно сформулировать следующим образом:
из внешнего источника (к примеру, файл с тем же расширением, но созданный в другом софте) была загружена группа узловых кривых произвольной формы и состоящая из произвольного количества узлов. Количество узлов в каждой кривой различно и уникально. Известно, что координаты последнего узла одной кривой совпадают с координатами первого узла следующей за ней. Но часть кривых при загрузке сместилась в произвольном направлении на произвольную величину. Надо найти эти кривые и поставить их на место. Чуть позже приложу рисунок, чтобы было нагляднее.

Добавлено через 15 минут
Поясняющие рисунки:
Миниатюры
Поиск координат узлов кривых в Corel Draw 12  
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
25.06.2014, 13:44
Ясно. А вручную, как пазл, это реально собрать?
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
25.06.2014, 13:51  [ТС]
Так и делается) Только этих кривых бывает очень много (за 100) и таких файлов тоже около 100... Времени уходит... Хотелось бы как-нибудь всё это автоматизировать, чтобы можно было тратить на такие вещи его поменьше.
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
25.06.2014, 14:28
Для 100 кривых 100! положений (размещений из 100 по 100).

Боюсь, человек всё же обгонит (обычную) ЭВМ в этом пазле.

Но если придумать сходящийся алгоритм (а не полный перебор)... что-то типа задачи курьера. В институте я её так и не решил.
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
25.06.2014, 14:52  [ТС]
100 - просто для примера, не очень много, но и не мало. А так... В одном файле - 20, в другом - 257, в третьем - 5 и т.д. Обгонит... Далеко не факт. Макросом должно выйти быстрее. Полный перебор тут и не нужен, там кроме кривых ещё много чего, но как отсечь кривые от всего остального я знаю и уже написал.

Добавлено через 8 минут
Я планировал через координаты действовать. Если координаты нужных узлов отличаются, то вычисляется разница, на которую задается сдвиг кривой. Кривые-то идут друг за другом, в том числе и по номерам. На рисунке синие 1 и 3, а красная - 2.
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
28.06.2014, 02:20
Ну тогда в принципе элементарно. Но с испугу даже не знаю, как об этом начать думать!
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
29.06.2014, 17:41  [ТС]
Согласен, в общем случае - ничего сложного. Но тут справедлива поговорка: "гладко было на бумаге, да забыли про овраги". В моём случае "овраг" - необходимость узнать координату нужного узла. Остальное, до и после этого момента, и в самом деле просто. Три цикла и одно ветвление, если не ошибаюсь.
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
20.08.2014, 10:06  [ТС]
Вроде бы разобрался. Правда не до конца, но кусочек кода решил выложить - может кто подскажет, как его оптимизировать да и вообще полезно, наверное, будет.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    ActiveDocument.Unit = cdrMillimeter 'устанавливаем единицы измерения координат и длины
    Dim a, a1, b, b1, c, c1, d, d1 As Long 'объявляем переменные (почему работает именно Long - не знаю)
    Dim s1 As Shape 'объявляем переменную. Здесь Shape - внутренний тип Corel Draw
    Set s1 = ActiveLayer.Shapes(2) ' присваиваем переменной некую кривую
    Dim s2 As Shape
    Set s2 = ActiveLayer.Shapes(1)
    c = s2.Curve.Nodes.Count ' находим общее число узлов кривой.
    Dim s3 As Shape
    Set s3 = ActiveLayer.CreateLineSegment(s2.Curve.Nodes(c).PositionX, s2.Curve.Nodes(c).PositionY, s1.Curve.Nodes(1).PositionX, s1.Curve.Nodes(1).PositionY) ' создаём кривую, соединяющую первый узел одной кривой и последний другой
    If s3.PositionX <> ActiveLayer.Shapes(4).PositionX Then ' задаем критерии, по которым будет определяться на своём месте сидит нужная кривая или нет
        Dim dltx As Integer
        dltx = s3.PositionX - ActiveLayer.Shapes(4).PositionX
        ActiveLayer.Shapes(4).Move dltx, 0# ' сажаем кривую на место
    End If
    If s3.PositionY <> ActiveLayer.Shapes(4).PositionY Then
        Dim dlty As Integer
        dlty = s3.PositionY - ActiveLayer.Shapes(4).PositionY
        ActiveLayer.Shapes(4).Move 0#, dlty
    End If
    s3.Delete
Добавлено через 25 минут
Только теперь это надо ещё и распространить на произвольное число кривых.
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
20.08.2014, 10:20
shm2013, если бы Вы с самого начала приложили бы не картинку, а файл *.cdr - возможно уже имели бы решение...

Добавлено через 5 минут
Цитата Сообщение от shm2013 Посмотреть сообщение
Может подскажете какой-нибудь форум, где можно найти помощь по данной теме?
Попробуйте там спросить - https://www.cyberforum.ru/coreldraw/
Не исключено, что там есть спецы в VBA или в каком другом языке макропрограммирования для Corel...
0
9 / 7 / 2
Регистрация: 23.06.2014
Сообщений: 54
20.08.2014, 10:21  [ТС]
С этим есть весьма существенные проблемы, решить которые, увы, нельзя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.08.2014, 10:21
Помогаю со студенческими работами здесь

Задачи в Corel DRAW
Помогите с заданиями пожалуйста,я никогда не пользовался этой программой 1 Преобразовать прямоугольник в неправильный восьмиугольник ...

Corel Draw где скачать
Где можна скачать Corel Draw x3 русская версия

Узнать версию Corel Draw
Имею вот такую картинку и не могу понять какая это версия Corel Draw. Нужна именно эта версия

Кодировка шрифта в Corel Draw X8
Добрый день. Столкнулся вот с какой проблемой. Использовал один шрифт (Sensa Wild Fill) последние месяца три (сначала с X7, потом с X8), и...

Различие Corel Draw и Photoshop
Здравствуйте! У меня такой вопрос мы в колледже изучали Corel Draw а затем Photoshop и вот в чем у меня вопрос просто почти вся группа мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru