|
Corel FORUM Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych |
|
Makra - Blokowanie niezaznaczonych obiektów
zyzio - 16 Wrzesień 2014, 18:24 Temat postu: 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 - 17 Wrzesień 2014, 14: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 |
Artur Miernik - 17 Wrzesień 2014, 15: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 - 17 Wrzesień 2014, 15: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 - 17 Wrzesień 2014, 16: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 - 17 Wrzesień 2014, 20: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.
zyzio - 17 Wrzesień 2014, 21: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 - 17 Wrzesień 2014, 22: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
|
|