[CDR X5-X8] при пакетной обработке не всегда видится шейп (Непредсказуемый IsOnShape)

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Да я не настаиваю если вам нравится ваш алгоритм то ради бога, пользуйтесть! Просто я вам указываю на то, что гораздо более простым прямым и быстрым способом можно было бы добиться гораздо точного результата чем вашими колдунскими манипуляциями. Да, ОМФГ, точнее и быстртрее вашего способа было бы дробить объект на ячейки и считать отношения площадей в качестве хэша! И никаких неочевидных и подозрительнвх итераций!
 

ydobemos

Участник
Сообщения
46
Реакции
1
Да я не настаиваю если вам нравится ваш алгоритм то ради бога, пользуйтесть! Просто я вам указываю на то, что гораздо более простым прямым и быстрым способом можно было бы добиться гораздо точного результата чем вашими колдунскими манипуляциями. Да, ОМФГ, точнее и быстртрее вашего способа было бы дробить объект на ячейки и считать отношения площадей в качестве хэша! И никаких неочевидных и подозрительнвх итераций!

Ладно, вот, я вроде сделал код соотвествующий сказанному вами выше - берём проверочный обьект, делаем его одного размера с изначальным (по вертикали в данном случае), накладываем их друг на друга и получаем обьект который является обрезком. Сопоставляем площадь обрезка с, в данном случае, 10% изначального обьекта н если он меньше то они похожи.

Вот только обрезка нормально проходит только с частью обьектов. Вы говорили что это наипростейшие базовые операции CorelDRAW - тога пожалуйста покажите как изменить код чтобы всё работало как надо.

Код:
Sub SimilarOrNot()
    Dim S As Shape, T As Shape
    Dim SR As New ShapeRange
    
    Set S = ActiveSelectionRange.Shapes.First
    SR.Add S
    
    For Each T In ActivePage.Shapes
    
        If IsSimilar(S, T) Then SR.Add T
    
    Next T
    
    SR.CreateSelection

End Sub

Function IsSimilar(S As Shape, T As Shape) As Boolean

    IsSimilar = False

    Dim V As Shape, W As Shape, Z As Shape
    
    If S.StaticID <> T.StaticID Then
        Set V = T.Duplicate
        V.Outline.Color.RGBAssign 255, 0, 0
        V.SetSize , S.SizeHeight
        V.CenterX = S.CenterX
        V.CenterY = S.CenterY
        
        Set W = S.Trim(V)
        
        If W Is Nothing Then
             IsSimilar = True
        Else
            If W.Curve.Area < S.DisplayCurve.Area * 0.1 Then IsSimilar = True
            W.Delete
        End If
        
    End If
    
End Function
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Зачем же Trim?
Я вроде говорил про Combine
 

ydobemos

Участник
Сообщения
46
Реакции
1
Зачем же Trim?
Я вроде говорил про Combine
Вы сказали "Лично я бы делал так - вычитал один контур из другого и считал площадь разницы" - на мой взгляд ето Trim. Combine же просто грубо соединяет два обьекта.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
"Лично я бы делал так - вычитал один контур из другого и считал площадь разницы" - на мой взгляд ето Trim.
Нет, вы неправильно понимаете принцип этих операций
На рисунке сверху - результат Trim, снизу Combine
Вам нужна суммарная площадь разницы, т е (A-B)+(B-A) такое проще всего через Combine и реализуется
upload_2017-4-26_6-47-53.png
 

ydobemos

Участник
Сообщения
46
Реакции
1
Нет, вы неправильно понимаете принцип этих операций
Уверены? Поступлю также как и вы - сами сделайте пробный код который покажет плошадь для обēктов соединенных Combine и Trim. Потом можем продолжить разговор.
 

_MBK_

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

ydobemos

Участник
Сообщения
46
Реакции
1
Там сверху есть цитата. ВЫ уверены что понимаете как ведут себя эти функции? Плошадь объекта после Combine просто грубая сумма площадей объектов которых комбинировали, как я и сказал выше. Какой от этого толк для данной операции?

Я не ленюсь чтобы проверить вашу теорию, пойдите на щажек напротив и модифицируйте код если так уверены в этом.
 

Вложения

  • TrimCombine.png
    TrimCombine.png
    86.4 КБ · Просм.: 861

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Trim 1 (A-B)
upload_2017-4-27_9-32-37.png
'
Trim 2 (B-A)
upload_2017-4-27_9-33-9.png

Combine (A-B)+(B-A)
upload_2017-4-27_9-32-1.png
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Плошадь объекта после Combine просто грубая сумма площадей объектов которых комбинировали, как я и сказал выше. Какой от этого толк для данной операции?
Похоже вы обнаружили локальный баг в собственной версии корела
Пришлите ваш пример в CDR, я гляну что не так
Только версию понизьте хотя бы до X6 - у меня здесь X8 нет
 

ydobemos

Участник
Сообщения
46
Реакции
1
Я не думаю что это локальный баг, думаю это просто стандартное поведение корела. Т.е. он по стандарту глючит - не смог правильно соеденить объекты, просто склепал как-то - пользователь ведь не заметит.

Я тот файл уже выбросил, но создал новый - в некоторых комбинациях данные верные, в других нет. Может это только в 2017 так, если не трудно, проверьте у себя.

Ну а также там реальные объекты которые надо выделить по форме, например все А образные с разными размерами, итд.

Unpredictable Combine

Код:
Sub TellUs()

    Dim S As Shape
    
    For Each S In ActiveSelectionRange
    
        ActiveLayer.CreateArtisticText S.LeftX, S.BottomY - 2, S.Curve.Area
    
    Next S

End Sub
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Я не думаю что это локальный баг, думаю это просто стандартное поведение корела. Т.е. он по стандарту глючит - не смог правильно соеденить объекты, просто склепал как-то - пользователь ведь не заметит.
По стандарту должен объединять правильно и правильно считать площадь объединенного объекта.
Возможно действительно баг новых версий, поскольку я сейчас (меня терзали смутные сомнения, что это связано с направлением обхода контуров) по всякому пробовал повторить баг в X3 - не получилось, на всех скомбинированных фигурах считает правильно, независимо от направления обхода. 'hmmm'
Хотя припоминаю, были какие то жалобы на санчесовском форуме на единичные случаи неправильной работы макроса CurveInfo, видимо, проблемы все таки есть.
Ok, тогда делайте так - вычитайте Trimом первый объект из второго, считайте площадь, потом второй из первого и суммируйте - не так быстро, но должно всегда работать правильно.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
На вашем примере баг тоже не воспроизводится
upload_2017-4-27_10-13-10.png
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
На X6 баг тоже не воспроизводится, правда и значение площади слегка другое 'P:E''\:E@@@'
upload_2017-4-27_10-18-53.png
 

ydobemos

Участник
Сообщения
46
Реакции
1
Ok, тогда делайте так - вычитайте Trimом первый объект из второго, считайте площадь, потом второй из первого и суммируйте - не так быстро, но должно всегда работать правильно.
Да, если оба объекта резать н потом суммировать то может и получится...
Вы осмотрели объекты на 2 и 3 страницах - у вас такие же аномалии плошади или там тоже все верно (если проверить кодом который я указал выше)?

На X6 баг тоже не воспроизводится, правда и значение площади слегка другое 'P:E''\:E@@@'
Ну, а вы говорите - базовые функции, можно доверять... Я с таким уже сталкивался, по этому не нравится работать с кривыми. Но может получиться что-то, если добавить проверки на неверные значения (например больше самого объекта).
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Вы осмотрели объекты на 2 и 3 страницах - у вас такие же аномалии плошади или там тоже все верно (если проверить кодом который я указал выше)?
Нет, выше написал, проверял в X3 и X6 которые были под рукой - повторить баг не удалось нигде
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Для совсем чистого эксперимента - вашим кодом
upload_2017-4-27_10-25-26.png
 

ydobemos

Участник
Сообщения
46
Реакции
1
Окей, этим я займусь.

Ну а если в данный код (выделения похожих объектов) добавить комбайн то на вящей системе оно рабоатет верно (с этими объектами а не прямоугольниками)?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 204
Реакции
10 848
Ну а если в данный код (выделения похожих объектов) добавить комбайн то на вящей системе оно рабоатет верно (с этими объектами а не прямоугольниками)?
Ну я ж на ваших объектах и проверял - вы ж скриншоты видели
 
Статус
Закрыто для дальнейших ответов.