Кольца и т.п.

Статус
Закрыто для дальнейших ответов.

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Ну теперь организовывайте цикл по всем элементам coll
Код:
For Each s In coll
... ' А здесь делайте с s все что вам надо - trim, intersect или что там?
Next s
только смотрите - coll теперь содержит все объекты, которые в документе есть - как из них кольца выделить?
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

я когда хочу (для проверки) сдвинуть окружности по очереди:
Код:
shag = 1
For Each s In coll
step = 10 * shag
ActiveLayer.Shapes(shag).Move step#, 0#
shag = shag + 1
Next s

получается ерунда. Я хочу чтобы самая большая окружность шагнула на 10 мм, следующая по размеру на 20 мм, ... А они у меня шагают в том порядке в каком были созданы в документе. Вот смотрите. Я сделал 7 окружностей. Сначала нарисовал окружности в таком порядке: диаметр 50 мм, 15 мм, 35 мм, 90 мм, 40 мм, 150 мм, 10 мм. В coll все отсортировано по длине, но в Object Manager они так и не поменялись местами. Там так и стоит первая кривая - окружность с диаметром 50 мм, вторая 15 мм, ... И когда я двигаю их "ActiveLayer.Shapes(shag).Move step#, 0#", то у меня сначала двигается кривая с номером (в Object Manager) 1 и это кривая с диаметром 50 мм, а хочется чтобы это была кривая с диаметром 150 мм - как в отсортированном массиве coll. Я так понимаю что он coll отсортировал, а в Object Manager эти кривые так и остались нетронутыми...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Вы так и не поняли идеологию программы. Зачем вы сортировали объекты в coll, если все равно потом работаете с ActiveLayer.Shapes? Забудьте про него, он вам уже не нужен. У вас есть прекрасная коллекция coll, в которой все те же объекты, только упорядочены:
Код:
shag = 1
For Each s In coll
step = 10 * shag
s.Move step#, 0#
shag = shag + 1
Next s
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Да, теперь все получилось. Я просто думал что coll "привязана" к объектам на слое, и упорядочивая coll мы упорядочиваем именно объекты. Все получилось, спасибо вам огромное, пойду дальше грызть гранит ВБА :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Скорее, наоборот, объекты на слое привязаны к этим коллекциям. ;)
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Подскажите пожалуйста еще вот какой момент. У меня сейчас задача следующая: есть объекты сверху и объекты слева. Мне нужно чтобы объекты сверху были упорядоченны в коллекцию coll1, а слева в коллекцию coll2. Если я их размещу на разных слоях, то как мне выбирать из какого слоя мне надо запихать объекты в collN? Я так понимаю вот тут "Set gb = ActiveLayer.FindShapes(, cdrCurveShape)" надо заменить ActiveLayer на Layer(1) для coll1 и на Layer(2) для coll2? Как это должно правильно быть написано в плане синтаксиса? :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Не совсем понял, что значит справа и слева?
Например, сделаяте проверку
Код:
if obj.PositionX<Max then
... ' Справа
else
... ' Слева
end if
Пойдет такой критерий?
А насчет слоев - да, если в ActivePage есть Layer(1) и Layer(2) то так и обращаться
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Не совсем понял, что значит справа и слева?

Имеется ввиду слева относительно центра рабочего поля, и сверху от него :)

А насчет слоев - да, если в ActivePage есть Layer(1) и Layer(2) то так и обращаться

То есть писать: Set gb = Layer(1).FindShapes(, cdrCurveShape) и Set gb = Layer(2).FindShapes(, cdrCurveShape)?
И еще вопросик :) В итоге у меня получиться две коллекции coll1 и coll2 для объектов с разных слоев, и у меня будет центральный объект, он на третьем слое. Дальше я в макросе должен буду выполнить операцию пересечения первого объекта из coll1 (он на Layer1) с "полосками" (центральный объект) на Layer3. Как это лучше сделать? Нет ли каких-нибудь нюансов с взаимодействием объектов с разных слоев? Может добавить этот центральный объект в конец, например, coll1? И еще, когда я сделаю следующую операцию - Trim объектом из coll2 по центральному объекту, то у меня получиться новый объект, который будет иметь другой "номер", я так понимаю? То есть допустим у меня центральный объект самый последний в coll1, и имеет номер 400. После операции Trim появится новый объект в конце коллекции coll1 с номером 401, или же он останется тем же 400ым номером, просто измениться его форма?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

То есть писать: Set gb = Layer(1).FindShapes(, cdrCurveShape) и Set gb = Layer(2).FindShapes(, cdrCurveShape)?
И еще вопросик В итоге у меня получиться две коллекции coll1 и coll2 для объектов с разных слоев,
Можно и так. А хотите, делайте все на одном слое, но потом уже внутри цикла по s проверяйте по PositionX - в coll1 или в coll2 добавлять объект.
Нет ли каких-нибудь нюансов с взаимодействием объектов с разных слоев?
Да вроде нет - вы же в кореле нормально логические операции проводите над объектами с разных слоев?
И еще, когда я сделаю следующую операцию - Trim объектом из coll2 по центральному объекту, то у меня получиться новый объект, который будет иметь другой "номер", я так понимаю? То есть допустим у меня центральный объект самый последний в coll1, и имеет номер 400. После операции Trim появится новый объект в конце коллекции coll1 с номером 401, или же он останется тем же 400ым номером, просто измениться его форма?
Нет, появится новый объект, который ни в одну коллекцию входить не будет. Смотрите внимательно описание команды Shape.Trim :

Function Trim(ByVal TargetShape As Shape, [ByVal LeaveSource As Boolean = True], [ByVal LeaveTarget As Boolean = False]) As Shape

То есть, она возвращает новый объект, но можно сделать, чтобы и старый не менялся. Я понятно излагаю?
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Да, вроде понятно :)

Я включил на запись макрос, и сделал несколько шагов из тех действий, которые мне нужны. Потом посмотрел что корел в макрос записал. Касаемо трима там появился такой кусок кода:

Dim s2 As Shape
Set s2 = ActiveLayer.Shapes(360).Trim(ActivePage.Layers("Layer 1").Shapes(2).Shapes(2), True, True)

То есть я сам могу создать переменную, типа Shape и в нее записать результат трима. Получается модифицированный объект теперь есть переменная s2. Теперь когда я буду делать следующую операцию трима, я могу сделать это так:

Dim s3 As Shape
Set s3 = ActiveLayer.Shapes(s2).Trim(ActivePage.Layers("Layer 1").Shapes(3).Shapes(3), True, True)

Я беру следующую окружность "Shapes(3)" и делаю операцию трима с объектом s2. Правильно ли я все понял? А дальше s3, ну и т.д. ...:) А почему в функции трима 2 раза написано Shapes(2)? Как мне в цикле автоматически создавать новые переменные типа Shape с разными номерами? Будет ли работать что-нибудь типа:

While a <=100
Dim sa As Shape
Set sa = ActiveLayer.Shapes(s(a+1)).Trim(ActivePage.Layers("Layer 1").Shapes(a).Shapes(a), True, True)
Wend

Или компилятор будет воспринимать sa какновую переменную "sa", а не как набор переменных "s1, s2, s3, ..."?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

НЕЕЕЕЕТ!!!!! :n)
Shapes - массив, его индекс никак не может быть шейпом!
Шейп - это элемент массива, я понятно излагаю?
Я ж вам процитировал из хелпа синтаксис метода Trim!
Он возвращает ссылку на полученный объект, а не на индекс этого объекта в массиве ActiveLayer.Shapes
Вообще забудьте про ActiveLayer.Shapes - у вас уже есть упорядоченный по периметру массив ссылок на объекты coll
При записи корел фигурирует фактическими номерами объектов в массиве ActiveLayer.Shapes - а вам они не известны! Вы можете оперировать только найденными объектами
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Да, да, да... понял) Получается надо делать как-то так:

Он ссылку возвращает на объект типа Shape, то есть надо создать такой объект и присвоить ему значение, которое вернет функция, а потом уже этот объект будет новым TargetShape?

Dim xx1 As Shape
xx1 = xx0.Trim(s,true,true)
где xx0 - объект, который будем тримить. А s - элемент из coll1, например...

А как мне сделать чтоб в цикле создавалась новая переменная, например xx'N', в которую будет записываться результат трима? А дальше получается я буду как таргет использовать xx'N-1'. Что значат параметры LeaveSource и LeaveTarget? Вы говорили что можно чтобы старый не менялся LeaveTarget имеет к этому какое-нибудь отношение? :) Если старый объект будет оставаться на своем месте, тогда у меня таргет будет все время один и тот же объект, да?
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

С вопросами по LeaveSource и LeaveTarget разобрался.

coll(385).Move 260#, 0#
Dim xx1 As Shape
xx1 = coll(385).Trim(coll(386), True, False)

Когда исполняется вот такой код вылетает ошибка "91: Object Variable or With block variabe not set". Хотя операция трима проходит, и получается то, что нужно... Что это значит?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Он ссылку возвращает на объект типа Shape, то есть надо создать такой объект и присвоить ему значение, которое вернет функция, а потом уже этот объект будет новым TargetShape?
Да

А как мне сделать чтоб в цикле создавалась новая переменная, например xx'N', в которую будет записываться результат трима? А дальше получается я буду как таргет использовать xx'N-1'.
А зачем вам плодить промежуточные объекты? Отрезайте от одного и того же xx. Ну, или коллекцию заведите, если они вам почему-то нужны и к ней через .add добавляйте.

Если старый объект будет оставаться на своем месте, тогда у меня таргет будет все время один и тот же объект, да?
LeaveSource=true - это значит старый объект будет оставаться, то же самое и с новым. А вот будут ли они на тех же местах в массиве ActivLayer.Shapes? - не уверен. Хотя, если промежуточным переменным ссылку на них присвоить - можно, наверное и попробовать.
xx1 = coll(385).Trim(coll(386), True, False)
Надо
Set xx1 = coll(385).Trim(coll(386), True, False)
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Все заработало, почти дописал все что хотел :) Счастлив нереально) Просто у меня там предвидится под 1000 файлов экспортировать, и я бы повесился руками это все делать :)

Как сделать что бы имя файла все время менялось?

Set expflt = ActiveDocument.ExportBitmap("C:\Users\Home\Desktop\Work\name_pcx.pcx", cdrPCX, cdrSelection, ...)

У меня есть переменная name_pcx которая увеличивается на 1 после каждого экспорта. Хочу чтоб файлы были 1.pcx, 2.pcx, ... Запись типа Work\'name_pcx'.pcx" не прокатила :) он создает один файл name_pcx.pcx и просто его перезаписывает...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

name=str(i)+".pcx”
Чтото в этом духе
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

я написал вот так вот:

Set expflt = ActiveDocument.ExportBitmap(Name = Str(name_pcx) + "C:\Users\Home\Desktop\Work\.pcx", cdrPCX, cdrSelection, ...)

а в папке пусто...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Set expflt = ActiveDocument.ExportBitmap(Name = Str(name_pcx) + "C:\Users\Home\Desktop\Work\.pcx", cdrPCX, cdrSelection, ...)
Вы ей-богу не обижайтесь, но у меня серьезные сомнения начинаются, что вы вообще на си программировали. :D
Код:
Name="C:\Users\Home\Desktop\Work\"+Str(name_pcx) + ".pcx"
Set expflt = ActiveDocument.ExportBitmap(Name, cdrPCX, cdrSelection, ...)
 

One_more_user

Участник
Топикстартер
Сообщения
25
Реакции
0
Ответ: Кольца и т.п.

Та не, не обижаюсь... Вы, как программист, должны понимать, что если 1й раз в глаза видишь VBA, то без потери недель времени вот так вот с ходу в синтаксисе не разобраться... Синтаксис похож у всех языков, но все языки все-равно разные) нужно время на то чтоб разобраться, а если есть кто-то кто уже разобрался и ему не сложно подсказать, то можно потратить гораздо меньше времени ;)

Если написать как вы сказали, то в строке
Name="C:\Users\Home\..." ошибка "Can't assign to read-only property". Заработало вот так:
Set expflt = ActiveDocument.ExportBitmap("C:\Users\Home\Desktop\Work\" + Str(name_pcx) + ".pcx", cdrPCX, ...)

Премного благодарен за помощь, щас все работает :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Кольца и т.п.

Да, немного грубанул, свойство Name уже есть, надо переменную как то по другому назвать, хотя бы Name_ или name1 ;)
Кстати - избегайте прямых индексов в массивах шейпов, типа, как я все время вижу в вашем коде coll(385), coll(386)...
Вы ж не знаете на каком индексе ваш объект будет при следующем запуске макроса или, даже, вообще после создания нового объекта.
Ищите нужный объект по какому-то признаку (тип, размер, цвет, координаты, положение и т.д.) потом заводите переменную и ей присваивайте ссылку на объект. Именно на объект а не индекс его. Даже запоминать индекс смысла нет.
 
Статус
Закрыто для дальнейших ответов.