[CDR X4 и ранее] Получить Shape, расположенный под/над другим Shape (без перебора)

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
Задача заключается в получении Shape, расположенного (расположенных) под другим Shape.
Задачу можно переформулировать: быстро получить все Shape из заданной прямоугольной области. Что-то не нахожу подходящих методов.

Можно, конечно, перебрать все Shape на странице/слое и фильтровать их по координатам. Но это полный перебор всех Shape на странице/слое. Если таковых миллионы...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Программно выделить и перебирать выделение.
 

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
Программно выделить и перебирать выделение.
Только вот не все объекты selectable. Нередактируемые слои, заблокированные объекты...
Придётся предварительно делать все слои редактируемыми, разблокировку всех объектов, визуализацию слоёв (если невидимые тоже нужны), затем выделять/фильтровать и затем восстанавливать editable/visible слоёв и lock объектов (собственным кодом или через Undo).
 

lev

Модератор
20 лет на форуме
Сообщения
2 143
Реакции
2 066

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
А чем это отличается от моего поста?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Эти методы не подходят нашему единоборцу.
 

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
ActivePage.SelectShapesFromRectangle
Вот файл X3 с двумя пересекающимися прямыми - красной и синей
Если выделить красную прямую, то метод ActivePage.SelectShapesFromRectangle() с параметром (Touch = True) синий прямоугольник не находит (не выделяет). Если выделить синий, то красный находит (выделяет):
Код:
Sub test()
    ActivePage.SelectShapesFromRectangle ActiveShape.LeftX, ActiveShape.BottomY, ActiveShape.RightX, ActiveShape.TopY, True
End Sub


CorelScript.SelectObjectsInRect
А этот метод-полтергейст вообще ничего не выделяет. В X3 в справке только список параметров присутствует, ни примера, ни описания параметров. Если под под Top Left Bottom Right понимать координаты TopY, LeftX, BottomY, RightX, то метод не работает. В X9 метод отсутствует вообще.
Код:
Sub test()
    CorelScript.SelectObjectsInRect ActiveShape.TopY, ActiveShape.LeftX, ActiveShape.BottomY, ActiveShape.RightX, True
End Sub
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
Да, здесь от левого верхнего. Но обычно наоборот - от нижнего левого угла.
Ладно, изменим процедуру:
Код:
Sub test()
    ActivePage.SelectShapesFromRectangle ActiveShape.LeftX, ActiveShape.TopY, ActiveShape.RightX, ActiveShape.BottomY, True
End Sub

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

lev

Модератор
20 лет на форуме
Сообщения
2 143
Реакции
2 066
Первый пример в X7 нормально выделяет независимо от выделенного первым объекта. У Вас и в Х3 и в Х9 не работает?
Объект CorelSCRIPT был удалён из VBA начиная с X7, спасибо, что сообщили, что в X9 он не возродился :), в теме указана версия "до Х4", поэтому я его упомянул.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Сейчас проверил у себя
И на X3 и на X6 баг не воспроизводится - выделяет и так и эдак
Значит локальный баг вашей конкретной версии
 

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
У Вас и в Х3 и в Х9 не работает?
В X9 работает корректно

И на X3 и на X6 баг не воспроизводится - выделяет и так и эдак
Значит локальный баг вашей конкретной версии
У меня русскоязычная версия X3 SP2 (13.0.0.739). Лицензия. У вас, насколько я понимаю, англоязычная (и возможно, пиратская).
Режим отображения: "Расширенный с наложениями"

---
Как оказалось, проблема устраняется переводом режима отображения в "каркас" или "упрощённый каркас" на время выполнения метода SelectShapesFromRectangle (в любых других режимах проблема сохраняется):
Код:
Sub test()
    Dim viewType As cdrViewType: viewType = ActiveWindow.ActiveView.Type: ActiveWindow.ActiveView.Type = cdrWireframeView
    Set selectionShape = ActivePage.SelectShapesFromRectangle(shape.LeftX, shape.TopY, shape.RightX, shape.BottomY, True)  'согласно справке: (X1,Y1) - верхний левый угол, (X2,Y2) - нижний правый угол
    ActiveWindow.ActiveView.Type = viewType
End Sub

P.S. Также вспоминается проблема с методом IsOnShape, устраняемая макcимальным увеличением масштаба отображения на период выполнения этого метода.
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
от масштаба не зависит
Что не зависит от маштаба ? Т.е. корректно работает при любых масштабах ?
У себя проверил (X3) - артефакт проявляется при любых масштабах отображения. Помогает только режим каркаса.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
[X8] - при пакетной обработке не всегда видится шейп (Непредсказуемый IsOnShape)
По давним опытам помнится, что IsOnShape зависит от режима просмотра, т.е. может выдавать неверный результат при запуске в режиме WireframeView и правильно работать в Normal/Enhanced.
А в случае с SelectShapesFromRectangle наоборот - некорректно работает в расширенном.

P.S. На всякий случай на время работы метода IsOnShape дополнительно к масштабу добавлю перевод в расширенный режим
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
Читаем внимательно:
По давним опытам помнится, что IsOnShape зависит от режима просмотра, т.е. может выдавать неверный результат при запуске в режиме WireframeView и правильно работать в Normal/Enhanced.
А в случае с SelectShapesFromRectangle наоборот - некорректно работает в расширенном.
P.S. На всякий случай на время работы метода IsOnShape дополнительно к масштабу добавлю перевод в расширенный режим