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
Blokowanie niezaznaczonych obiektów
Autor Wiadomość
zyzio 
Praktyk


Dołączył: 06 Cze 2011
Posty: 90
Skąd: Podkarpacie
Wysłany: 16 Wrzesień 2014, 19:24   Blokowanie niezaznaczonych obiektów

Witam. Poszukuję makra, które będzie w stanie wykonać coś takiego jak "odwrotność" aktualnego zaznaczenia i zablokować automatycznie wszystkie wybrane w ten sposób obiekty aby można było spokojnie edytować tylko te wybrane na samym początku.
Drugi moduł powinien z kolei wyszukać i odblokować wszystkie zablokowane uprzednio obiekty. W Illustratorze dało się bez problemu stworzyć coś takiego na zasadzie "nagrywania" wykonywanych czynności, lecz w Corelu X3 nie istnieje operator "select invers"
Łopatologicznie to powinno wyglądać mniej więcej tak:
1. Zaznaczam interesujący mnie obiekt lub kilka obiektów
2. Uruchamiam pierwszą część makra, która zaznaczy i zablokuje odwrotność a następnie powróci do "oryginalnego" pierwotnego zaznaczenia.
3. Po dokonaniu edycji uruchamiam 2 część makra, które powinno odblokować wszystkie zablokowane wcześniej obiekty i powrócić ponownie do "oryginalnego" zaznaczenia.

Na chwilę obecną pracuję w Corelu X3.
Z góry dzięki za info...
 
 
maroQ 
Doradca


Pomógł: 16 razy
Wiek: 39
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
Wysłany: 17 Wrzesień 2014, 15:58   

keyzetman napisał/a:
Łopatologicznie to
...nie trzeba używać zaznaczenia.

W VBA można zaznaczać wszystko, ale jeśli nie jest to konieczne nie trzeba tego robić.

skreślić:--Blokowanie zaznaczonych kształtów:--
errare humanum est: Miało być "Blokowanie wszystkich poza zaznaczonymi:"
Kod:
Sub LockAllExceptActiveRange()
    Dim s As Shape
   
    For Each s In ActivePage.Shapes
        If ActiveSelectionRange.IndexOf(s) = 0 Then
            s.Locked = True
        End If
    Next s
End Sub


Odblokowywanie wszystkiego na stronie:
Kod:
Sub UnlockAll()
    Dim s As Shape
   
    For Each s In ActivePage.Shapes
        s.Locked = False
    Next s
End Sub


Zaznaczenie odwrotne:
Kod:
Sub InvertSelection()
    Dim sr As ShapeRange
    Set sr = ActiveSelectionRange
   
    ActivePage.Shapes.All.CreateSelection
    sr.RemoveFromSelection
End Sub
Ostatnio zmieniony przez maroQ 17 Wrzesień 2014, 21:15, w całości zmieniany 3 razy  
 
 
Artur Miernik 



Pomógł: 49 razy
Wiek: 51
Dołączył: 18 Lip 2010
Posty: 1608
Skąd: Starachowice
Wysłany: 17 Wrzesień 2014, 16:18   

To odblokowanie wszystkiego na stronie przyda mi się, oj przyda.

Ale jeszcze bardziej — w całym dokumencie, czyli na wszystkich stronach. A najbardziej — we wszystkich otworzonych dokumentach. Ech, gdyby tak… było.
 
 
maroQ 
Doradca


Pomógł: 16 razy
Wiek: 39
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
Wysłany: 17 Wrzesień 2014, 16:58   

Artur Miernik napisał/a:
we wszystkich otwartych dokumentach

Kod:
Sub UnlockAllUniverse()
    Dim d As Document
    Dim p As Page
    Dim s As Shape
   
    For Each d In Documents
        For Each p In d.Pages
            For Each s In p.Shapes
                s.Locked = False
            Next s
        Next p
    Next d
End Sub
 
 
zyzio 
Praktyk


Dołączył: 06 Cze 2011
Posty: 90
Skąd: Podkarpacie
Wysłany: 17 Wrzesień 2014, 17:57   

maroQ już jest prawie dobrze ale chciałbym aby zaznaczanie odwrotności i jej zablokowanie wykonywało się w jednym przejściu a nie jako 2 oddzielne części kodu.
I fajnie by było aby na końcu zaznaczony pozostał pierwotny obiekt a nie te zablokowane :)
Jeśli to nie problem to będę wdzięczny za taką zmianę :)

Edit
Ha no i wymóżdżyłem coś sam:P Tak czy inaczej lecą podziękowania dla maroQ za wskazanie odpowiedniej drogi.

Kod:
Sub InversAndLock()

    Dim sr As ShapeRange
    Set sr = ActiveSelectionRange
   
    ActivePage.Shapes.All.CreateSelection
    sr.RemoveFromSelection
   
    Dim d As ShapeRange
    Set d = ActiveSelectionRange
    Dim s As Shape
   
    For Each s In ActiveSelectionRange
        s.Locked = True
    Next s
    d.RemoveFromSelection
    sr.AddToSelection
       
End Sub
 
 
maroQ 
Doradca


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

keyzetman napisał/a:
wymóżdżyłem coś sam

Ech... zupełnie niepotrzebnie...

W tekście zrobiłem błąd. W kodzie "LockAllExceptActiveRange" nie ma błędów tj. nazwa mówi: zablokuj wszystkie poza zaznaczonym przedziałem. Te które są zaznaczone zaznaczonymi pozostają. Spodziewałem się, że sprawdzisz kod nim zaczniesz pisać własny, ale uwierzyłeś mi na słowo i stąd problem.

Jak już pisałem zaznaczanie w tym momencie jest bezcelowe. Twój kod jest kręceniem się w kółko, no ale itak gratuluję odwagi w pisaniu.

Napisałem:
maroq napisał/a:
Blokowanie zaznaczonych kształtów:

zamiast:
maroq napisał/a:
Blokowanie wszystkich poza zaznaczonymi:
.
Piszę swój program i wchodzę tu tylko na chwilę odpisując w formie relaksu i stąd gafa.

--edit--
Dodatkowe dwa klocki:
Kod:
Sub LockSelectedShapes()
    Dim s As Shape
   
    For Each s In ActiveSelectionRange.Shapes
            s.Locked = True
    Next s
End Sub

Sub InvertLock()
    Dim s As Shape
   
    If ActiveSelectionRange(1).Locked Then
        UnlockAll
        LockAllExceptActiveRange
    Else
        UnlockAll
        LockSelectedShapes
    End If
End Sub


LockSelectedShapes - blokuje zaznaczone kształty
InvertLock - odwarca blokadę (wymaga LockAllExceptActiveRange i UnlockAll z posta wyżej)

P.S. Uruchom i porównaj InversAndLock oraz LockAllExceptActiveRange. Przekonasz się, że dają te same efekty. plotki
 
 
zyzio 
Praktyk


Dołączył: 06 Cze 2011
Posty: 90
Skąd: Podkarpacie
Wysłany: 17 Wrzesień 2014, 22:27   

maroQ napisał/a:
...P.S. Uruchom i porównaj InversAndLock oraz LockAllExceptActiveRange. Przekonasz się, że dają te same efekty...

W rzeczy samej masz rację. Nie jestem programistą ale z ciekawości dopytam w vb w tym przypadku indeks "0" przyjmują wszystkie nieaktywne w danym momencie obiekty tak?
Może się czegoś nauczę:)
Do mojego prymitywnego kodu dopisałem jeszcze grupowanie po odwróceniu zaznaczenia, bo przy większej ilości obiektów blokowanie każdego z osobna zajmuje za dużo czasu, a tak blokowana jest tylko grupa.
 
 
maroQ 
Doradca


Pomógł: 16 razy
Wiek: 39
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
Wysłany: 17 Wrzesień 2014, 23:56   

keyzetman napisał/a:
w vb w tym przypadku indeks "0" przyjmują wszystkie nieaktywne w danym momencie obiekty tak
To nie jest specyfika vba tylko specyfika programów które go używają. Zarówno w Corelu jak i w Excelu liczymy od 1. Zera w tym przypadku oznaczają brak indeksu. Indeks w tym przypadku określa kolejność elementów w zaznaczeniu która z kolei jest związana z kolejnością obiektów w warstwach.

Do skrócenia czasu blokowania można użyć optymalizacji lub wygasić okno Corela (tej opcji nie polecam z VBA na wypadek gdyby coś się zwiesiło) wtedy nie ma to czy się grupuje czy nie nie ma aż takiego wielkiego znaczenia.

Przykład:
Kod:
Sub UnlockOptimalized()
    CorelDRAW.Optimization = True
    On Error Resume Next
    UnlockAll
    CorelDRAW.Optimization = False
    CorelDRAW.Refresh
End Sub

Kod:
Sub LockOptimalized()
    CorelDRAW.Optimization = True
    On Error Resume Next
    LockAllExceptActiveRange
    CorelDRAW.Optimization = False
    CorelDRAW.Refresh
End Sub


Bardzo duże przyspieszenie widać przy odblokowywaniu wielu dokumentów:
Kod:
Sub UnlockAllUniverseOptimalized()
    CorelDRAW.Optimization = True
    On Error Resume Next
    UnlockAllUniverse
    CorelDRAW.Optimization = False
    CorelDRAW.Refresh
End Sub

Osobiście nie używam blokowania obiektów ale jak ktoś męczy się z odblokowywaniem tysięcy obiektów w kilkunastu dokumentach to można by się jeszcze pokusić o UserForm z paskiem postępu by wiedzieć, czy "Tu przerwał, lecz róg trzymał; wszystkim się zdawało,
Że Wojski wciąż gra jeszcze, a to echo grało". Bo czasem Wojski jeszcze gra, a wszystkim się wydaje, że trzeba zabić proces Corela :mrgreen:
 
 
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: 13