Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/48: Рейтинг темы: голосов - 48, средняя оценка - 4.85
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
1

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

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

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

Добавлено через 23 часа 23 минуты
Никто с Corel не пересекался? Можно не обязательно с 12-м, там VBA вроде не сильно меняется от версии к версии. Или нужна дополнительная информация?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2014, 10:24
Ответы с готовыми решениями:

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

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

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

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

40
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 11:05 2
С 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
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
24.06.2014, 11:12  [ТС] 3
Немного не то. Сейчас скину кусочек кода с пояснениями.
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 11:32 4
Попробуйте. Но диалог будет продуктивен лишь с имеющим Corel.

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

Выше код неработающий; теперь нашёл готовый проект (там, по F6, типичная работа с узловыми линиями):
Вложения
Тип файла: doc раскидай.doc (56.5 Кб, 9 просмотров)
1
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
24.06.2014, 11:40  [ТС] 5
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
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.06.2014, 11:49 6
Действительно! 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
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
24.06.2014, 13:15  [ТС] 7
Эти параметры указываются после End With. А файл я скачал.

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

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

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

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

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

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

Добавлено через 8 минут
Я планировал через координаты действовать. Если координаты нужных узлов отличаются, то вычисляется разница, на которую задается сдвиг кривой. Кривые-то идут друг за другом, в том числе и по номерам. На рисунке синие 1 и 3, а красная - 2.
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
28.06.2014, 02:20 16
Ну тогда в принципе элементарно. Но с испугу даже не знаю, как об этом начать думать!
0
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
29.06.2014, 17:41  [ТС] 17
Согласен, в общем случае - ничего сложного. Но тут справедлива поговорка: "гладко было на бумаге, да забыли про овраги". В моём случае "овраг" - необходимость узнать координату нужного узла. Остальное, до и после этого момента, и в самом деле просто. Три цикла и одно ветвление, если не ошибаюсь.
0
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
20.08.2014, 10:06  [ТС] 18
Вроде бы разобрался. Правда не до конца, но кусочек кода решил выложить - может кто подскажет, как его оптимизировать да и вообще полезно, наверное, будет.
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
Заблокирован
20.08.2014, 10:20 19
shm2013, если бы Вы с самого начала приложили бы не картинку, а файл *.cdr - возможно уже имели бы решение...

Добавлено через 5 минут
Цитата Сообщение от shm2013 Посмотреть сообщение
Может подскажете какой-нибудь форум, где можно найти помощь по данной теме?
Попробуйте там спросить - https://www.cyberforum.ru/coreldraw/
Не исключено, что там есть спецы в VBA или в каком другом языке макропрограммирования для Corel...
0
8 / 6 / 2
Регистрация: 23.06.2014
Сообщений: 51
20.08.2014, 10:21  [ТС] 20
С этим есть весьма существенные проблемы, решить которые, увы, нельзя.
0
20.08.2014, 10:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2014, 10:21
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru