Из Корел в CSV (WKT), пока только замкнутые кривые

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Ответить
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Trace » 18 авг 2011, 07:45

Написал макрос как замкнутые кривые (шейпы), точнее координаты их, экспортировать в формат CSV
Работает только с активным слоем. Конверитует палитру в RGB
поумолчанию сохраняет в 1 файл со всеми слоями "C:\temp\polygon.csv" и N-файлов равное количеству слоев путь тот же, только название файлов от 001 до 999
Спойлер

Код: Выделить всё

Sub Shape2csv()
    Dim a1 As Long, a2 As Long, a3 As Long, a4 As Long, a5 As Long, a6 As Long, R As Long, G As Long, B As Long
    Dim x As Double, Xend As Double, y As Double, Yend As Double
    Dim Stn As String, St As String, S As String, Stall As String, txt As String, alltxt As String, massiv() As String
    Dim n As Node, n2 As Node
    Dim s1 As Shape, s2 As Object, sr As New ShapeRange
    Dim i As Integer
    Dim MyFile
    If ActiveSelectionRange.Count = 0 Then Set sr = activeLayer.FindShapes _
        Else Set sr = ActiveSelectionRange.Shapes.FindShapes
    If sr.Count = 0 Then Exit Sub
'    Application.EventsEnabled = False                          '
'    Application.Optimization = True                             '
'    ActiveDocument.PreserveSelection = True               '
    a1 = sr.Count
    ReDim massiv(1 To a1)
    a2 = 1
    a5 = 1
    MyFile = FreeFile
    Set s1 = activeLayer.Shapes(a2)
    For Each s1 In sr
        i = i + 1
        a4 = s1.Curve.SubPaths.Count
        If s1.Fill.UniformColor.Type <> cdrColorRGB Then
            s1.Fill.UniformColor.ConvertToRGB
        End If
        Stall = ""
        If a4 = 1 Then
            a5 = s1.Curve.Segments.Count
            St = ""
            Stn = ""
            For a3 = 1 To a5
                If a3 = a5 Then
                    Set n = s1.Curve.Segments.Item(a3).StartNode
                    x = n.PositionX
                    y = n.PositionY
                    Xend = s1.Curve.Segments.Item(1).StartNode.PositionX
                    Yend = s1.Curve.Segments.Item(1).StartNode.PositionY
                    Stn = Stn & x & " " & y & "," & Xend & " " & Yend
                Else
                    Set n = s1.Curve.Segments.Item(a3).StartNode
                    x = n.PositionX
                    y = n.PositionY
                    Stn = Stn & x & " " & y & ","
                End If
                Stall = "(" & Stn & ")"
            Next a3
        Else
            For a6 = 1 To a4
                a5 = s1.Curve.SubPaths.Item(a6).Segments.Count
                St = ""
                Stn = ""
                For a3 = 1 To a5
                    If a3 = a5 Then
                        Set s2 = s1.Curve.SubPaths.Item(a6)
                        Set n = s2.Segments.Item(a3).StartNode
                        x = n.PositionX
                        y = n.PositionY
                        Set n2 = s2.Segments.Item(1).StartNode
                        Xend = n2.PositionX
                        Yend = n2.PositionY
                        Stn = Stn & x & " " & y & "," & Xend & " " & Yend
                    Else
                        Set s2 = s1.Curve.SubPaths.Item(a6)
                        Set n = s2.Segments.Item(a3).StartNode
                        x = n.PositionX
                        y = n.PositionY
                        Stn = Stn & x & " " & y & ","
                    End If
                Next a3
                If a6 = a4 Then
                    St = "(" & Stn & ")"
                    Stall = Stall + St
                Else
                    St = "(" & Stn & ")"
                    Stall = Stall + St + ","
                End If
            Next a6
        End If
    massiv(i) = Stall
    Next s1
    For i = a1 To 1 Step -1
        If a1 = 1 Then
            R = s2.Fill.UniformColor.RGBRed
            G = s2.Fill.UniformColor.RGBGreen
            B = s2.Fill.UniformColor.RGBBlue
        Else
            R = activeLayer.Shapes(i).Fill.UniformColor.RGBRed
            G = activeLayer.Shapes(i).Fill.UniformColor.RGBGreen
            B = activeLayer.Shapes(i).Fill.UniformColor.RGBBlue
        End If
        txt = Chr(34) + "POLYGON(" & massiv(i) & ")" + Chr(34) + "," & R & ":" & G & ":" & B & vbCrLf
        Open ("C:\temp\polygon_" & Format(i, "###000") & ".csv") For Output As #MyFile                'Эти 3 строки убрать если не нужно экспортировать каждую кривую в отдельный файл
            Print #MyFile, "WKT,RGB" & vbCrLf & txt                                                                       'Путь прописан "C:\temp\polygon.csv"
        Close                                                                                                                               '
        alltxt = alltxt + txt
    Next i
    Open ("C:\temp\polygon.csv") For Output As #MyFile                        'Эти 3 строки убрать если не нужен 1 файл со всеми слоями
        Print #MyFile, "WKT,RGB" & vbCrLf & alltxt                                  'Путь прописан "C:\temp\polygon.csv"
    Close                                                                                             '
'    Application.EventsEnabled = True
'    Application.Optimization = False
'    ActiveDocument.PreserveSelection = False
    MsgBox "Все сделал"                                        '
End Sub
Чуть позже доделаю и экспорт всех объектов. В планах добавить трансформацию всех объектов в нужную систему координат.
Учтите что экспортируются только координаты точек. лучше слой экспортировать в формат wmf и обратно импортировать в корел.
Последний раз редактировалось Trace 09 сен 2011, 06:50, всего редактировалось 1 раз.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Boris » 20 авг 2011, 01:33

Я видно упустил какую-то беседу. Экспорт в CSV - это интересное решение, но вот в Corel старых версий входил стандартный макрос, который без труда переводил все, что умеет читать Коел, во все, что он умеет писать. В частности в DXF. Все слои, все кривые и т.п., даже с учетом масштаба. При правильном выборе версии (ниже 14-ой) он еще и кривые в полилинии переводил с успехом. И палитру сохранял.

Донецков
Гуру
Сообщения: 3058
Зарегистрирован: 19 май 2010, 19:44
Репутация: 189

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Донецков » 20 авг 2011, 11:51

Из Corel беда при экспорте в тот же DXF: кривые Безье превращаются в сплайны и потом с ними "битва", чтобы в нормальные полилинии превратить... В последнее время много с этим сталкивался, у геологов ненормальная "любовь" к оформлению структурных и др. карт в Corel ... иногда проще заново оцифровать по привязанному растру, только жалко что работы фактически дублируются...

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Александр Мурый » 20 авг 2011, 14:36

У меня получалось так:
1) CDR to PS --> uniconvertor
2) PS to DXF --> pstoedit
3) DXF to GIS --> ogr2ogr
Ну или вместо 3-го шага привязываем вектор куда надо.
Редактор материалов, модератор форума

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Boris » 20 авг 2011, 18:17

У меня получалось так:
а) берем модуль из корела. на вид обычный VBA
б) слегка дополняем модуль в части конвертации в DXF
- кривые в сплайны - сплайны в линии - все стандартными средствами самого корела
- убиваем всякие изыски (рыбий глаз, градиены и т.п.) - архитекторы от них без ума :)
в) экспортруем все в DXF с установками масштаба. Как правило 1:100, т.е. единица экрана в 100 единиц DXF

Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Trace » 20 авг 2011, 18:50

amuriy писал(а):У меня получалось так:
1) CDR to PS --> uniconvertor
у меня лично проблема с текстом и графикой на несколько листов.
Донецков писал(а):...у геологов ненормальная "любовь" к оформлению структурных и др. карт в Corel ...
С Вами полностью согласен. У Нас точно "любовь" к Корелу))) просто в институте ни какому бесплатному или платному программному продукту связанному с предпечатной подготовкой карт не обучали, прийдя на работу где все используют корел, Фонды принимают материал предпочтительно в формате cdr. Да и программа простая и понятная + долгий срок использования в организациях.
А вообще спасибо за ответы. Интерестно макрос кто нить использовал? есть ошибки?

Донецков
Гуру
Сообщения: 3058
Зарегистрирован: 19 май 2010, 19:44
Репутация: 189

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Донецков » 25 авг 2011, 13:51

Подскажите как стандартными средствами самого корела перевести:
кривые в сплайны - сплайны в линии
для экспорта в DXF
т.к. по вышеуказанному пути: pstoedit на WIN7 x64 не запускается....

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Александр Мурый » 25 авг 2011, 14:11

Нашел нечто для экспорта DXF из корела: DXFTool
В самом кореле вроде была кнопка для перевода кривых в полилинии.

Но, по-любому, указанный здесь способ лучше (IMHO), т.к. не нужен сам "КорелДров".
Редактор материалов, модератор форума

Донецков
Гуру
Сообщения: 3058
Зарегистрирован: 19 май 2010, 19:44
Репутация: 189

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Донецков » 29 авг 2011, 16:35

К сожалению, в Х5 преобразование кривых Бизье и сплайнов в полилинии не сохраняет формы исходного объекта, т.е. не добавляет вершин...

Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Trace » 09 сен 2011, 07:09

Boris писал(а):У меня получалось так:
...
- кривые в сплайны - сплайны в линии - все стандартными средствами самого корела
...
Можно поподробнее? что то я незнаю как сделать это :oops:

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Из Корел в CSV (WKT), пока только замкнутые кривые

Сообщение Boris » 10 сен 2011, 01:22

Извините, я к программе не подходил уже лет 10. Не знаю даже номер текущей версии. Еле нашел Корел-12 на машине. Нашел еще CorelDRAW Graphics Suite X5 на ней же но он криво установлен, и не запускается, что мне в целом без надобности - документация есть на том спасибо.
Макрос я точно писал на основе имеющегося макроса File converter. Вот вступление к Macro Programming Guide.pdf от CorelDRAW Graphics Suite X5 - страница 6
The following sample VBA macros are included for CorelDRAW:
...
• File converter (FileConverter.gms) — converts a vector or bitmap to a specified vector or bitmap format.
You can choose export parameters by using dialog boxes associated with particular filters. You can also save
each page as a separate file and set various page properties, such as size, orientation, and background color.
The following file formats are supported: AI, BMP, CDR, CGM, CMX, CPT, DSF, DXF, EPS, GIF, JPEG,
PCT, PNG, PPF, SVG, SWF, TIF, WMF, and WPG.
У меня тогда стояла задача массово выгрузить труды королистов, созданные с градиентами, заливками рыбий глаз и т.п., в формат доступный ГИС. Я помню, что я ее успешно решил доработав этот макрос "напильником" - добавил в форму пару-тройку переключателей, которые были в объекте, связанном с DXF, но которые не были выведены наружу. С тех пор никто больше не приходил и макрос умер не своей смертью при перестановках машин, т.к. корел его хранит в своей рабочей папке. После вашего вопроса я прошелся по закромам и нашел какую-то версию. Она явно отличается от стандартной - той, что идет в поставке. Но при этом в моем Corel-12 не отрабатывает до конца. То ли названия стандартных вызовов поменялись, то ли еще что. Может и версия найденная не последняя. Не помню. Код формы, которая замещала стандартную форму из примера я выкладываю. В ней есть функция correctCorelGeometry в ней программно выполняются преобразования от всяких художественных излишеств.
frmFileConverterEx.rar
(18.82 КБ) 506 скачиваний
Судя по наличию закомментированных кусков в коде, либо это не последняя версия, либо я убил все, что не смог заставить работать.
Я понимаю, что читать чужой код дело малоприятное, но и для меня он теперь как чужой. И вспомнить куда делись то ли формы, то ли функции к которым этот код обращается, уже затруднительно. Из того, что я успел увидеть, понятно, что "курвы" и полигоны не разбираются далее - только упрощаются. Значит за перевод в линии, а скорее полигоны, отвечал стандартный модуль экспорта вызываемой командой Document.ExportEx.
Одно помню точно, что программно рисунки избавлялись от всего, что мешало экспорту в DXF.
Если вы спрашивали как это сделать обычными командами - пунктами меню, то тут "не знал, да еще и забыл".
Если ваш корел не содержит VBA, то тогда я давал не те советы - новомодными программными средами .Net и т.п. не смог себя заставить овладеть :(

Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя