[CDR X5-X8] Упорядочивание объектов для резки

  • Автор темы Автор темы SEX_LENIVEC
  • Дата начала Дата начала

SEX_LENIVEC

батрак без пенсии
Топикстартер
10 лет на форуме
Сообщения
330
Реакции
49
многие программы плотерной резки режут из под корела в соответствии с порядком нахождения объектов на странице. Первый- сампый нижний , второй, тот что выше и т.д. Интересует макрос который перебирал объекты от правого нижнего угла и расставлял их по порядку.такое вообще возможно?
 
Возможно, конечно, но вы должны понимать простую вещь: обьекты в кореле упорядочены по времени создания и положению на экране. То есть, при переупорядочивании самые нижние объекты вылезут на передний план.
 
В порядке бреда обычным пузырьком
Код:
    Dim i As Long, t As Boolean
    t = True
    Do While t
        t = False
        For i = 1 To ActiveLayer.Shapes.Count - 1
            If ActiveLayer.Shapes.Item(i).CenterX > ActiveLayer.Shapes.Item(i + 1).CenterX And ActiveLayer.Shapes.Item(i).CenterY < ActiveLayer.Shapes.Item(i + 1).CenterY Then
                ActiveLayer.Shapes(i).OrderBackOf ActiveLayer.Shapes(i + 1)
                t = True
            End If
        Next i
    Loop
 
Условие для упорядочивания (X1>X2) && (Y1<Y2) внушает мне смутные сомнения
По идее, должно быть приоритетное упорядочивание по Y менее приоритетное - по X 'hmmm'
 
Да, условие сравнения надо усложнить. В данном случае работает верно лишь для идеального случая при расположении объектов слева-вниз \
Можно прогнать два раз. Сначала с условием (Y1<Y2), после с (X1>X2)
 
Например (Y1<Y2) || ((Y1=Y2) && (X1>X2))
 
хм ребята а ка эти пользоваться?
 
Можно отсортировать по расстоянию от некой удалённой точки справа внизу
Код:
Sub Macro1()
    Dim i As Long, t As Boolean
    t = True
    Do While t
        t = False
        For i = 1 To ActiveLayer.Shapes.Count - 1
            S1 = Sqr((-100000 - ActiveLayer.Shapes.Item(i).CenterY) ^ 2 + (100000 - ActiveLayer.Shapes.Item(i).CenterX) ^ 2)
            S2 = Sqr((-100000 - ActiveLayer.Shapes.Item(i + 1).CenterY) ^ 2 + (100000 - ActiveLayer.Shapes.Item(i + 1).CenterX) ^ 2)
            If S1 < S2 Then
                ActiveLayer.Shapes(i).OrderBackOf ActiveLayer.Shapes(i + 1)
                t = True
            End If
        Next i
    Loop
End Sub
 
Не понимаю, вроде логично
 

Вложения

  • 1.PNG
    1.PNG
    28.1 КБ · Просм.: 705
Не понимаю, вроде логично
Это же режет плоттер не так ли? Вовсе нелогично сперва резать дальний объект, а потом возвращаться к ближайшему. По одной координате упорядочивать тоже с этой точки зрения нелогично, возможны подобные коллизии. Наверное, можно придумать хэшфункцию,которая как то более оптимально объекты упорядочивала для порезки.
 
Неужели друзья-математики не написали для плоттерщиков алгоритм поиска наикратчайшей траектории обхода?
 
Запилили бы какой-нибудь простенький эвристический алгоритм для оптимизации.
 
хм народ! я так и не понял, решение то есть?
 
как этим пользоваться то? это макрос?