[CDR X5-X8] Отрисовка элемента в фигуре

  • Автор темы Автор темы Vadimsapr
  • Дата начала Дата начала
Делаю цикл перед созданием линии. С циклами всегда была проблема до этого только на Delphi более менее программировал, сейчас читаю и пробую циклы. И все равно макрос распознает группу как один прямоугольник. А методом тыка уйдёт много времени. Политика цикла понятна. Ставим условие - тело цикла - когда закончить. А вот с написанием беда.
 

Вложения

  • 1509346902585-14045591.jpg
    1509346902585-14045591.jpg
    308.1 КБ · Просм.: 746
И все равно макрос распознает группу как один прямоугольник.
Ну я ж вам уже говорил как надо сделать - берете свойство Shapes у группы и перебираете все его элементы в цикле.
А методом тыка уйдёт много времени. Политика цикла понятна.
Так не пойму, понятна или нет? 'hmmm'
Или вы хотите в рамках топика лекцию про то как циклы организовывать на VBA?
Так мы с вами далеко не уйдем, Лев сейчас быстренько наши онлайн-курсы прикроет;)
 
Ну я ж вам уже говорил как надо сделать - берете свойство Shapes у группы и перебираете все его элементы в цикле.

Так не пойму, понятна или нет? 'hmmm'
Или вы хотите в рамках топика лекцию про то как циклы организовывать на VBA?
Так мы с вами далеко не уйдем, Лев сейчас быстренько наши онлайн-курсы прикроет;)

Лекций в сети много, но все из разряда
For I = 1 to 5
---
Next
У меня p1 и р2 это shape
По сути беру эти 2 прямые и ставлю их в цикл, но прямоугольники то я рисую до того как сгруппировать и запустить макрос. Группу же обозначить нужно. P.s по моему я опять в дебри полез))
 
Лекций в сети много, но все из разряда
Я бы все же посоветовал вам матчасть подучить перед тем как сюда писать. Ибо я преподавательской деятельностьюзанимался в прошлом тысячелетии и в рамках топика объяснять вам как строятся циклы - как минимум будет злостным оффтопом. Тем более, у нас снова начинается языковый барьер, ваша последняя фраза
По сути беру эти 2 прямые и ставлю их в цикл, но прямоугольники то я рисую до того как сгруппировать и запустить макрос. Группу же обозначить нужно.
ушла из зоны моего понимания.
Я правильно понимаю - у вас ActiveSelection содержит один элемент - группу, так? И вам надо сперва хотя бы убедиться что это именно группа, а не один прямоугольник,проверить Type объекта. Далее - ActiveSelection - это какбы не одинобъект, а массив их,его тоже перебирать в цикле надо, проверяя Type каждого шейпа. И если текущий шейп - группа, то перебирать коллекцию Shapes уже этого шейпа вложенным циклом. Видите, насколько глубока кроличья нора?
 
Я бы все же посоветовал вам матчасть подучить перед тем как сюда писать. Ибо я преподавательской деятельностьюзанимался в прошлом тысячелетии и в рамках топика объяснять вам как строятся циклы - как минимум будет злостным оффтопом. Тем более, у нас снова начинается языковый барьер, ваша последняя фраза

ушла из зоны моего понимания.
Я правильно понимаю - у вас ActiveSelection содержит один элемент - группу, так? И вам надо сперва хотя бы убедиться что это именно группа, а не один прямоугольник,проверить Type объекта. Далее - ActiveSelection - это какбы не одинобъект, а массив их,его тоже перебирать в цикле надо, проверяя Type каждого шейпа. И если текущий шейп - группа, то перебирать коллекцию Shapes уже этого шейпа вложенным циклом. Видите, насколько глубока кроличья нора?


Вижу. Что мне ещё долго придётся разбираться. По вашим словам здесь 3 цикла перебора. Ну что сказать если получится разобраться с циклами это будет очень хорошо. Просто мне легче на конкретных примерах. А для CorelDraw таких не так много, либо они есть но код скрыт всеми защитами и его хранят как военную тайну. Спасибо вам буду искать информацию дальше.
 

Вложения

  • 15093493653221065535706.jpg
    15093493653221065535706.jpg
    239.2 КБ · Просм.: 762
По вашим словам здесь 3 цикла перебора.
Да если бы!
Я вам только верхушку айсберга обрисовал, чтобы сразу не пугать.
На самом деле проблем гораздо больше. Во-первых, группы могут быть вложенные, причем глубина вложения неограниченная. А значит, перебирать объекты придется рекурсивно, вызывая процедуру перебора каждый раз, когда встретится группа. Про существование паверклипов я даже не упоминаю, предположим, в ваших файлах их просто нет.
Но самое ужасное - вышеописанный метод (запомнил координаты - нарисовал две линии) здесь не годится вообще, поскольку прямоугольников много а первое же создание новой линии рушит весь перебор начисто. То есть, придется выдумывать какой то головоломный костыль, скажем, на первом рекурсивном проходе заполнять некий новый массив координат, из которого на втором проходе рисовать отрезки.
В общем, все достаточно сложно получается.
Проще всего, наверное, для начала, разгруппировать все и перебирать плоский список объектов ActiveSelection не заморачиваясь на группы вообще.
 
Да если бы!
Я вам только верхушку айсберга обрисовал, чтобы сразу не пугать.
На самом деле проблем гораздо больше. Во-первых, группы могут быть вложенные, причем глубина вложения неограниченная. А значит, перебирать объекты придется рекурсивно, вызывая процедуру перебора каждый раз, когда встретится группа. Про существование паверклипов я даже не упоминаю, предположим, в ваших файлах их просто нет.
Но самое ужасное - вышеописанный метод (запомнил координаты - нарисовал две линии) здесь не годится вообще, поскольку прямоугольников много а первое же создание новой линии рушит весь перебор начисто. То есть, придется выдумывать какой то головоломный костыль, скажем, на первом рекурсивном проходе заполнять некий новый массив координат, из которого на втором проходе рисовать отрезки.
В общем, все достаточно сложно получается.
Проще всего, наверное, для начала, разгруппировать все и перебирать плоский список объектов ActiveSelection не заморачиваясь на группы вообще.

Нужно получить список объектов группы. И работать уже с этим списком как я понимаю. Буду искать мануалы
 
есть но код скрыт всеми защитами и его хранят как военную тайну
Я вам все таки советую на примерах поучиться. Вовсе необязательно код в макросах закрыт, вот, например, с открытым кодом.
 
Да вовсе и не обязательно
Можно и стандартным FOR i=1 TO ActiveSelection.Shapes.Count ...

Что то начинает получаться. Вижу что он берет 2 прямоугольника и рисует 4 линии но так же как будто это 1 прямоугольник. Значит нужно его научить считать прямоугольники по отдельности
 

Вложения

  • 1509358118530-14045591.jpg
    1509358118530-14045591.jpg
    250 КБ · Просм.: 735
Что то начинает получаться. Вижу что он берет 2 прямоугольника и рисует 4 линии но так же как будто это 1 прямоугольник. Значит нужно его научить считать прямоугольники по отдельности

Все между for и next выполняется n раз, а это n раз количество прямоугольников
 
Там внутри цикла координаты каждого шейпа брать надо, другое дело, что после первого созданич линии ActiveSelection испортится. А значит его надо в самом начале в другой массив сохранить например
 
Там внутри цикла координаты каждого шейпа брать надо, другое дело, что после первого созданич линии ActiveSelection испортится. А значит его надо в самом начале в другой массив сохранить например

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

Отлично. Я так и попытался сделать по мануалам из сети но что то идёт не так. Мне координаты a,b,c,d нужно в массив загнать. Пишут что делается это так
Например

Dim a(10) as long
Т.е объявляем а в нем массив 10 элементов
 
Ну например так. Но у вас массив нефиксированной длины - вы ж заранее не знаете сколько там шейпов будет - может один а может стопитсот? Или размер изменять в процессе работы через ReDim
 
Ну например так. Но у вас массив нефиксированной длины - вы ж заранее не знаете сколько там шейпов будет - может один а может стопитсот? Или размер изменять в процессе работы через ReDim

Просто как вариант. Мне чтобы понять как работает. В массив записываю. Ошибка почему.
 

Вложения

  • 15093641626841065535706.jpg
    15093641626841065535706.jpg
    115.8 КБ · Просм.: 452
Код:
Sub Macro1()
    Dim p1 As Shape
    Dim p2 As Shape
    Dim N As Integer
    ActiveDocument.Unit = cdrMillimeter
    N = ActiveSelection.Shapes.Count
  
    Dim arrA() As Long
    ReDim arrA(4, N)
    
    For k = 1 To N
        arrA(1, k) = ActiveSelection.Shapes(k).LeftX
        arrA(2, k) = ActiveSelection.Shapes(k).TopY
        arrA(3, k) = ActiveSelection.Shapes(k).RightX
        arrA(4, k) = ActiveSelection.Shapes(k).BottomY
    Next k
    
    For i = 1 To N
        X1 = arrA(1, i) + 3
        Y1 = arrA(2, i)
        X2 = arrA(1, i) + 3
        Y2 = arrA(4, i)
        
        Set p1 = ActiveLayer.CreateLineSegment(X1, Y1, X2, Y2)
        
        X1 = arrA(3, i) - 3
        Y1 = arrA(2, i)
        X2 = arrA(3, i) - 3
        Y2 = arrA(4, i)
        
        Set p2 = ActiveLayer.CreateLineSegment(X1, Y1, X2, Y2)
    Next i
End Sub