Некорректное преобразование абриса в объект в Corel X3-X6

  • Автор темы Автор темы Cyrax
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: Программное выявление реверсной заливки

Еще раз повторяю - автор темы занимается восточными единоборствами, у него каша в голове, он путает несколько совершенно разных случаев - "разное направление контуров", "несвязанные фрагменты кривых" и "безумные шейпы". Да, в той теме случай был с контурами, но в ЭТОЙ контура ни при чем, ибо смена направления обхода не приводит к нормальному результату. Тут - случай именно глючного шейпа.
 
Ответ: Программное выявление реверсной заливки

у него каша в голове, он путает несколько совершенно разных случаев - "разное направление контуров", "несвязанные фрагменты кривых"
Вообще-то тему я создал, чтобы разобраться в проблеме. Если бы знал, в чём дело, тему бы не поднимал. Логично ?
Про разное направление контуров - вроде как ваши слова. Что касается разбиения результрующей кривой-обводки на множество subpath'ов, так это имеет место вот здесь.

но в ЭТОЙ контура ни при чем, ибо смена направления обхода не приводит к нормальному результату.
Приводит. В нижеприведённом примере предварительное изменение направления кривой устраняет проблему.

И связан этот глюк вовсе не с контурами, а со свойством Angle в Calligraphy обводки. Поставьте там 0 - все будет конвертироваться превосходно. Я думаю, глюк этот сразу не пофиксили, потому как мало извращенцев задают букве обводку с овальным шейпом stretch 80% и углом в -61.3 градуса
Вот пример глюка, в котором шейп 100%, угол 0 градусов. Тем не менее, сабжевая проблема по-прежнему имеет место.
 

Вложения

Ответ: Программное выявление реверсной заливки

И тем не менее, это та же проблема с шейпами. Смените шейп на квадратный или измените толщину на микрон до 0.4 - проблема уйдет.
 
Ответ: Программное выявление реверсной заливки

И тем не менее, это та же проблема с шейпами. Смените шейп на квадратный или измените толщину на микрон до 0.4 - проблема уйдет.

Проблема уйдёт в X3. Собственно я не поленился и нашёл сообщение, Вл.Соловьева, пункт 3. "конвертации обводки в объект" стала выполняться на мой взгляд более корретно."
Т.е. проблему начали лечить в X3 и почти окончательно долечили в X4 или X5. Тут, вроде бы, в очередном холиваре ai-vs-cdr, несколько лет назад давали тест -- делаем двухметровую надпись с обводкой и превращаем обводку в кривые. В 99 случаев из 100 эта операция выдавала брак. Про изменение шейпа никто даже не говорил. До X3. В X3 проблему решили частично.
 
Ответ: Программное выявление реверсной заливки

И тем не менее, это та же проблема с шейпами. Смените шейп на квадратный или измените толщину на микрон до 0.4 - проблема уйдет.
_MBK_, вот пример, в котором изменение толщины на микрон не решает проблему (см. ниже)
Уверен, что и изменение угла на квадратный сработает не во всех случаях.

Могу провести тьфу, привести ещё ряд "технико-тактических приёмов", позволяющих НЕгарантированно избежать проблемы при преобразовании:
1. Перемещение
2. Вращение
3. Отражение
4. Изменение наконечника
Все эти операции в некоторых случаях помогают. Но не во всех. И с шейпами они не связаны.
 

Вложения

Ответ: Программное выявление реверсной заливки

Прикольно. У меня обводка разлетается даже при shape stretch-100%, angle-0, углы квадратные. И это в X6!
:)
 
Ответ: Программное выявление реверсной заливки

У меня обводка разлетается даже при shape stretch-100%, angle-0, углы квадратные. И это в X6!
На каком примере ?

P.S. Похоже, не стоит обновлять X3. Другие глюки появятся. А в X3 все родные...
 
Ответ: Программное выявление реверсной заливки

На X6 не пробовал, но все описанные примеры прекрасно конвертируются в X5. И уж явно не связаны с неисправностями контуров. Согласен - это плавающий баг корела. Пользуйтесь не обводками а эффектом контур.
 
Ответ: Программное выявление реверсной заливки

Пользуйтесь не обводками а эффектом контур.
Не представляется возможным. Должны быть именно outline'ы.
 
Ответ: Программное выявление реверсной заливки

На самом деле мы ушли в махровый оффтоп. Вы со мной согласны, что название темы совершенно не соответствует заявленной в примерах проблеме? Это - плавающий глюк корела, его то фиксят, то он опять всплывает. Я сейчас даже сходу динамику не могу понять, в каких случаях он проявляется - совершенно непредсказуемо, примерно понятно, что это как то связано с шейпом и степенью его деформации, а так же сложностью исходного объекта. То есть, чем больше узлов и субконтуров на исходном объекте и чем сильнее деформирован шейп - тем больше вероятность, что глюканет. Хотя, как мы уже видели, может проявиться и на одной букве. Я бы рекомендовал пользоваться контуром, на крайняк - в битмап гнать.
 
Ответ: Программное выявление реверсной заливки

Ну почему же не соответствует.
Вот программку написал, которая для всех выделенных шейпов:
а) преобразовывает абрис в объект
б) если преобразование происходит с глюком, исходный объект восстанавливается
в) удаляет "пустые" объекты-заливки (в Corel X3 они создаются)
г) выделяет все объекты, преобразование которых выполняется некорректно.

Далее уже объекты, оставшиеся непреобразованными, можно "добить" и вручную, используя озвученные выше "технико-тактические приёмы", либо преобразовать их в растр. Благо, таких объектов малый процент.

Код:
'Преобразование абриса в отдельный объект (некорректные преобразования откатываются)
Sub OutlineToObject()
    Dim unit As cdrUnit
    Dim selectedShRange As ShapeRange
    Dim shSrc As shape          'исходный shape
    Dim shCopyMain As shape     'дубликат для преобразований
    Dim shCopyOutLine As shape  'объект-абрис, полученный после преобразования shCopyMain
        
    If ActiveSelectionRange.count = 0 Then
        MsgBox "Выделите один или несколько объектов и повторите операцию."
        Exit Sub
    End If

    ActiveDocument.BeginCommandGroup ("OutlineToObject")
    
    unit = ActiveDocument.unit
    ActiveDocument.unit = cdrMillimeter
    
    'на период преобразований выделение снимается (ускорение работы операций)
    Set selectedShRange = ActiveSelectionRange
    ActiveSelectionRange.RemoveFromSelection
    
    For Each shSrc In selectedShRange
        If (shSrc.CanHaveOutline) Then
            If (shSrc.Outline.Type <> cdrNoOutline) Then
            
                Set shCopyMain = shSrc.Duplicate(0, 0)                  'дубликат для преобразований
                Set shCopyOutLine = shCopyMain.Outline.ConvertToObject  'преобразование абриса дубликата в объект
                
                'есть пересечения => преобразование выполнено некорректно => преобразование откатывается
                If (HasIntersection(shCopyOutLine)) Then
                    shCopyMain.Delete
                    shCopyOutLine.Delete
                Else
                    shSrc.Delete
                    If (shCopyMain.Fill.Type = cdrNoFill) Then shCopyMain.Delete
                End If
            End If
        End If
    Next
       
    'выделение объектов, преобразование которых выполняется некорректно
    selectedShRange.CreateSelection
    
    ActiveDocument.unit = unit
    ActiveDocument.EndCommandGroup
End Sub


'Проверка наличия у shape'а "бубликов" (т.е. имеет ли shape пересекающиеся фрагменты (subpath))
Function HasIntersection(ByRef sh As shape) As Boolean
    Dim intersections As CrossPoints
    Dim find As Boolean
    Dim i1 As Integer, i2 As Integer
    Dim path1 As SubPath, path2 As SubPath
        
    find = False
    For i1 = 1 To sh.Curve.SubPaths.count - 1
        
        'исключение из проверки фрагментов (subpath) с пренебрежимо малой длиной
        If (Not PathLengthIsNegligible(sh.Curve.SubPaths.Item(i1))) Then
    
            For i2 = i1 + 1 To sh.Curve.SubPaths.count
        
                'исключение из проверки фрагментов (subpath) с пренебрежимо малой длиной
                If (Not PathLengthIsNegligible(sh.Curve.SubPaths.Item(i2))) Then
            
                    Set intersections = sh.Curve.SubPaths.Item(i1).GetIntersections(sh.Curve.SubPaths.Item(i2))
                    If (intersections.count > 0) Then
                        find = True
                        Exit For
                    End If
                    If (find) Then Exit For
                End If
                
            Next i2
        End If
    Next i1
    
    HasIntersection = find
End Function


'Проверка, является ли фрагмент (path) пренебрежимо коротким
Function PathLengthIsNegligible(ByRef path As SubPath)
    Const unit = cdrMillimeter
    Const tolerance = 0.01
    Dim negligible As Boolean
    
    ActiveDocument.unit = cdrMillimeter
    negligible = False
    
    If (path.Segments.count = 1) Then
        If (path.Length <= tolerance) Then
            negligible = True
        End If
    End If
    
    PathLengthIsNegligible = negligible
End Function

Единственная проблема - на большом числе объектов преобразование будет выполняться ооооочень долго.
 
Ответ: Программное выявление реверсной заливки

То есть, вы считаете, что наличие самопересечений - критерий неправильности преобразования? Сомнительно, я видел сбойные контура просто с вылетевшими узлами, но без самопересечений. У меня была другая идея - чуть дергать параметры (толщину обводки, угол поворота шейпа и смотреть, как изменится площадь или периметр кривой. Но эта идея тоже дохлая, есть и устойчивые глючные состояния, которые на мелкие изменения не реагируют. Самое надежное - по идее, опять же, рисовать контур с нужным смещением и смотреть, насколько площадь и периметр его от заданного отличается. Ну или в растр переводить и с растром сравнивать что ли? Но вообще говоря, не пойму, для чего огород городить? Вроде ж говорят что в поздних апдейтах это пофиксено.
 
Ответ: Программное выявление реверсной заливки

я видел сбойные контура просто с вылетевшими узлами, но без самопересечений.
Приведите пример.
 
Ответ: Программное выявление реверсной заливки

О баге отрепортил, может починят.
 
Ответ: Программное выявление реверсной заливки

Приведите пример.
Сейчас уже, сходу, и не повторю. Но, в принципе, да, в подавляющем большинстве случаев самопересечения есть, так что можно и так проверять.
 
Ответ: Программное выявление реверсной заливки

Я однажды уже тут писал, что из корела в принципе невозможно распечатать макеты, где присутствует текст с обводкой, на xerox dc 252. Эту проблему в ксероксе знают, но разводят руками. По-ходу это отсюда ноги растут.
(Хотя удивительно, что в X4 я ни разу не сталкивался с глюком при конвертировании обводки. Думал окончательно починили. А сейчас сделал несколько тестов в X6 -- проскакивает иногда).
 
Ответ: Программное выявление реверсной заливки

По-ходу это отсюда ноги растут.
Думаю навряд ли. Глючит именно сам алгоритм перевода обводки с кастомным шейпом в кривую. А там, скорее, используется в растр перевод, который всегда нормально работал. В иллюстраторе, насколько я понимаю, кастомный шейп и каллиграфия вообще отсутствует.
 
Ответ: Программное выявление реверсной заливки

Думаю навряд ли.
Просто я погорячился когда написал "невозможно распечатать". Оно распечатывается. Но 90% площади листа залито плашкой цвета обводки. Причём там какие-то линии огромного размера и прочие фигуры.


Не по теме:
В иллюстраторе, насколько я понимаю, кастомный шейп и каллиграфия вообще отсутствует.
Как это нет? Каллиграфическая кисть. А шейпы для обводки вообще имеют профиль, который можно прямо на объекте, интерактивно подрегулировать (в версиях cs5-6, разумеется). На живой текст это, конечно, не положишь -- нужно в кривые переводить.

 
Ответ: Программное выявление реверсной заливки

Просто я погорячился когда написал "невозможно распечатать".
Сложно сказать, я проверить не могу. Думаю это, скорее, проблема драйвера этого аппарата, а не корела.
А шейпы для обводки вообще имеют профиль, который можно прямо на объекте, интерактивно подрегулировать (в версиях cs5-6, разумеется).
Я имел в виду параметры Calligraphy в свойствох абриса.
Возможно в поздних версиях уже сделали, опять же, проверить не могу, у меня под рукой только CS3. А там опции обводки гораздо более убогие, чем даже в кореле X3.
 
Статус
Закрыто для дальнейших ответов.