Corel FORUM Strona Główna Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload

Poprzedni temat «» Następny temat
Macro do porównania dwóch plików cdr
Autor Wiadomość
oblus 
Początkujący


Dołączył: 07 Lut 2014
Posty: 3
Skąd: RŚL
  Wysłany: 7 Luty 2014, 11:56   Macro do porównania dwóch plików cdr

Cześć poszukuję macra lub funkcjonalności w Corel Draw do porównania zawartości dwóch plików wektorowych cdr.
Wyjaśniam:
mam plik v1 gdzie mam kilka linii, kropek itp - wektory
mam plik v2 gdzie mam to samo co w v1 +nowe linie, kropki itp
potrzebuję takie macro żeby widzieć różnice pomiędzy plikami, np w taki sposób że po włączeniu makra pozostają mi tylko wektory, których nie ma w v1...

czy ktoś coś takiego kojarzy??

:poklon

ps. pracuje na CorelDraw v11
 
 
oblus 
Początkujący


Dołączył: 07 Lut 2014
Posty: 3
Skąd: RŚL
Wysłany: 14 Marzec 2014, 09:13   

ktokolwiek?
 
 
Shame 
Red Dot Corporation



Wersja CorelDRAW: X7
Pomógł: 213 razy
Wiek: 40
Dołączył: 19 Kwi 2012
Posty: 2565
Skąd: Poznań
Wysłany: 14 Marzec 2014, 13:31   

Skoro nikt nie pisze, znaczy się, że nikt o czymś takim nie słyszał. W sumie pomysł dobry, pewno każdemu nie raz coś takiego chodziło po głowie. Ale może jeszcze nie powstało, może ciężko to zrobić przy krzywych? Bo pewno trzeba by nie tylko porównywać pozycję węzłów, ale same równania opisujące krzywe, a nie wiem, czy to jest bezpośrednio dostępne przez VB...
 
 
bidon184
[Usunięty]

Wysłany: 14 Marzec 2014, 17:24   

znaczy program by musiał wiedzieć co porównywać,to cięzko z tym będzie,jedynie co zostaje to patrzeć na róznice obiektów krzywych itd
 
 
chezare 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 15 Marzec 2014, 10:09   

Takie makro z całą pewnością da się napisać, tylko że ja nie widzę w tym sensu i obawiam się, że to, że takowego jeszcze nie ma, jest spowodowane tym, że inni mają tak samo? :-)
 
 
oblus 
Początkujący


Dołączył: 07 Lut 2014
Posty: 3
Skąd: RŚL
Wysłany: 23 Marzec 2014, 13:11   

już tłumaczę sens:

prowadzę dokumentację kablową w corelu (logiczne połączenia - niestety kontynuuje pracę poprzednika i za dużo roboty by to przerzucać do innego programu) i co jakiś czas muszę zrobić inwentaryzację lub po prostu sprawdzić co się zmieniło...

co jakiś czas robię nową wersję pliku gdzie są stare linie i nowe.. i tak w koło dodaje nowe....

po to właśnie przydałoby mi się porównać zawartość dwóch plików

np. program zbiera informacje z pliku v10 jakie są w nim obiekty i sprawdza czy te same są w pliku v11 - jeśli są to je usuwa - w pliku wynikowym mam tylko to co program uznał za nieobecne w v10

to już duuużo daje ;>
 
 
maroQ 
Doradca


Pomógł: 16 razy
Wiek: 40
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
  Wysłany: 13 Wrzesień 2014, 21:06   

oblus napisał/a:
np. program zbiera informacje z pliku v10 jakie są w nim obiekty i sprawdza czy te same są w pliku v11 - jeśli są to je usuwa - w pliku wynikowym mam tylko to co program uznał za nieobecne w v10

Dało by się takie coś zrobić zakładając, że modyfikowany jest ten sam plik i krzywe nie podlegają rozbiciu np. rozłączenie, usunięcie lub dodanie węzła dla danej krzywej lub co gorsza utworzenie jej na nowo. Chodzi o to, że każdy obiekt w Corelu (typu Shape) ma swój niepowtarzalny identyfikator. Póki nie zacznie się modyfikować krzywej ten identyfikator pozostaje stały. Istnieje możliwość zebrania wszystkich identyfikatorów z jednego pliku i takich samych z drugiego pliku po czym sprawdzanie ich w pętli i eliminacja tych które występują w obu plikach. Gorzej jeśli identyfikator (StaticID) nie może być brany pod uwagę. W takim przypadku trzeba by sprawdzać wszystkie krzywe np. po ich węzłach i sprawdzać czy wszystkie węzły są identyczne. To niestety było by bardzo nieprzyjemne do napisania i z całą pewnością trwało dłużej niż samo sprawdzenie identyfikatorów. Właściwie by opisać dowolną krzywą potrzebne są współrzędne węzłów i kąty oraz długości stycznych do każdego z węzłów (tak można opisać praktycznie każdą krzywą, a jeśli nawet dany segment jest liniowy [brak stycznych] to da się go zamienić na taki który styczne posiada).

Osobiście bardziej złożone obliczeniowo makra wolę robić w VB.NET gdzie jest lepsza obsługa błędów. Przy dużej ilości obliczeń Corel miewa swoje humory i potrafi się w nich gubić. Dlatego dla bardzo złożonych zadań lub wymagających dużej precyzji wolę przenieść dane do bazy danych i tam dokonać obliczeń. Sterowniki do baz lub serwery baz (są bazy nie wymagające serwera np. SQLite) są pisane w językach niskiego poziomu więc czas dokonania obliczeń jest znacznie niższy niż gdyby ten sam kod przetwarzać w pamięci przez VBA lub VB.NET. Raz dla testów napisałem bibliotekę w Fortranie i uruchomiłem ją z VB.NET, porównując czas wykonania tej samej operacji numerycznej napisanej w VB.NET i okazało się, że różnice w czasie wykonania obliczeń są nie tylko mierzalne, ale i bardzo duże. Nawet sam kod napisany w czystym fortranie w porównaniu z kodem skompilowanym w nowszych wersjach w gcc jest szybszy. Dobra tyle nudzenia bo mnie zaraz ktoś ochrzani, że go obrażam :D
 
 
chezare 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 14 Wrzesień 2014, 14:55   

Coś Ty Szaman taki grzeczny się zrobił? :-)
Jak by wszędzie było tak grzecznie i sympatycznie jak tutaj, to by człowiek umarł z nudów :-)
Od lutego do września sporo czasu minęło, już pewnie kolega ten rebus rozwiązał "ręcznie"? :-)
Nie wiem co to jest to kablowanie, nie wiem o co chodzi z tymi logicznymi połączeniami i już zupełnie nie rozumiem, że istnieje schemat czegoś, później to coś zostaje w jakiś sposób zmodyfikowane i zaznaczone na tym schemacie i zostaje zapisane do nowego pliku,
W tym pliku powinien być aktualny obraz sytuacji, to jaki jest sens porównywać to z czymś nieaktualnym i na podstawie tego nieaktualnego pliku, skasować coś w tym aktualnym? A jak tych plików jest więcej niż dwa? A jak w takiej grafice powtarzają się identyczne elementy, to porównywanie kształtów nie ma sensu, bo trzeba by jeszcze ustalić odniesienia do innych składowych żeby nie skasować nie tej co trzeba kropki. Jak w jednym tekście jest pięć kropek, a w drugim sześć, to którą zostawić?
Po identyfikatorach, to jest to zadanie proste (chyba, bo ja się na tym nie znam), ale to też nie koniecznie jest przepis na sukces, bo w nowym pliku z dajmy na to okręgu została zrobiona elipsa i ciągle ma ten sam identyfikator.
 
 
maroQ 
Doradca


Pomógł: 16 razy
Wiek: 40
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
  Wysłany: 14 Wrzesień 2014, 19:36   

chezare napisał/a:
Po identyfikatorach, to jest to zadanie proste, ale to też nie koniecznie jest przepis na sukces, bo w nowym pliku z dajmy na to okręgu została zrobiona elipsa i ciągle ma ten sam identyfikator.

No tak zmiany szerokości i wysokości oraz np. zaokrąglenia w prostokątach, modyfikacje wielokątów itp. nie zmieniają identyfikatora, podobnie jak wiele innych operacji. Zakładając jednak, że do schematów elektrycznych zapewne się raczej coś dokłada lub usuwa, a nie modyfikuje rozwiązanie powinno działać.



Wyjaśnię przez przykład:
Kod:
Sub SimpleCompareDemoVer(ByVal docOld As String, ByVal docNew As String, Optional removeOld As Boolean = False)
    On Error Resume Next

    Dim wnd As Window
    Dim doc1 As Document, doc2 As Document
   
    For Each wnd In Windows
        If wnd.Caption Like "*" + docOld + "*" Then
            Set doc1 = wnd.Document
        ElseIf wnd.Caption Like "*" + docNew + "*" Then
            Set doc2 = wnd.Document
        End If
    Next wnd
   
    If doc1 Is Nothing Or doc2 Is Nothing Then
        MsgBox "Brak jednego z dokumentów!", vbInformation, "[ ] <- "
        Exit Sub
    End If
   
    Dim s1 As Shape, s2 As Shape
   
    doc2.BeginCommandGroup "Usun stare"

    doc2.Pages(1).CreateLayer "Archiwum"
    With doc2.Pages(1).Layers("Archiwum")
        .Color = CreateRGBColor(255, 0, 0)
        .OverrideColor = True
    End With
 
    For Each s1 In doc1.Pages(1).Shapes
        For Each s2 In doc2.Pages(1).Shapes
            If s1.StaticID = s2.StaticID Then
                If removeOld Then
                    s2.Delete
                Else
                    's2.Name = "Stary"
                    s2.MoveToLayer doc2.Pages(1).Layers("Archiwum")
                End If
            End If
        Next s2
    Next s1
   
    doc2.EndCommandGroup
   
End Sub


Sub TestujMakro()
    'Przed uruchomieniem otwórz pliki:
    ' 1. Schemacior1.cdr
    ' 2. Schemacior2.cdr
    ' 3. Schemacior3.cdr
    ' Wszystkie muszą być otwarte!!!
   
    SimpleCompareDemoVer "Schemacior2", "Schemacior3"
    'wywołanie z kasowaniem tj. stare obiekty zostają usunięte
'    SimpleCompareDemoVer "Schemacior1", "Schemacior2", True
    'wywołanie bez kasowania tj. wszystkie stare obiekty przenoszone są na warstwę Archiwum
    SimpleCompareDemoVer "Schemacior1", "Schemacior2"
End Sub


Załączone pliki Schemacior{N}.cdr (gdzie {N} to 1,2,3) są kolejno modyfikowanymi wersjami schematu. Ich częścią wspólną są obiekty o tych samych identyfikatorach i one mają zostać usunięte lub przeniesione na warstwę Archiwum.
Kod jest dość prosty, więc nie ma co wymagać od niego zbyt wiele.

chezare napisał/a:
Od lutego do września sporo czasu minęło, już pewnie kolega ten rebus rozwiązał "ręcznie"?

No tak... trochę czasu mnie nie było, a szkoda zostawić taki fajny pomysł bez odpowiedzi.
Poza tym google i inne wyszukiwarki podlinkowują takie tematy i kiedy ktoś szuka rozwiązania znajdując treść bez odpowiedzi to taki temat pełni rolę spamu. Sam wielokrotnie szukałem odpowiedzi na forach zagranicznych i często jeśli problem został rozwiązany to do nazwy tematu dopisuje się "Solved" co bardzo pomaga w googlowaniu.

chezare napisał/a:
jaki jest sens porównywać to z czymś nieaktualnym i na podstawie tego nieaktualnego pliku, skasować coś w tym aktualnym

Też nie wiem. Może chodzi o określenie jakich zmian dokonano podczas kolejnych prac, ale w takim przypadku lepiej było by np. przenieść stare rzeczy do warstwy archiwum, pokolorować je lub cokolwiek, byle nie kasować bo to powoduje, że schemat może stać się bezużyteczny. No ale nie wnikam. Przykładowo można narzucić warstwie kolor czerwony i nowe obiekty (włącznie z symbolami) będą miały czerwone obrysy.

P.S. Narysowany schemat jest bezużyteczny, ale chciałem jakoś zobrazować jak makro działa, więc spłodziłem go na poczekaniu.

Schemaciory.zip
Pobierz Plik ściągnięto 347 raz(y) 39.12 KB

 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Nowe zasady dotyczące cookies. Wykorzystujemy pliki cookies, aby nasz serwis lepiej spełniał Państwa oczekiwania. Można zablokować zapisywanie cookies, zmieniając ustawienia przeglądarki.
         
Strona wygenerowana w 0.1 sekundy. Zapytań do SQL: 14