|
Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych
|
POMOC / Makro do rozmieszczenia obiektów |
Autor |
Wiadomość |
marek_maro
Początkujący
Dołączył: 20 Mar 2009 Posty: 7 Skąd: Gorzów Wlkp.
|
Wysłany: 29 Czerwiec 2014, 17:30 POMOC / Makro do rozmieszczenia obiektów
|
|
|
Witam, czy dałoby radę stworzyć makro które brało by kolejne obiekty położone jeden na drugim i umieszczało (środkowało w pionie i poziomie) je w kwadratach.
Może obrazowo to lepiej będzie tłumaczyć o co mi chodzi :)
|
|
|
|
|
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: 29 Czerwiec 2014, 18:01
|
|
|
Zaznacz najpierw "koło", potem "kwadrat" a potem naciśnij C, a potem E (lub E > C, obojętnie).
Wyjaśniam: najpierw zaznaczasz obiekt przesuwany, a potem zaznaczasz obiekt, względem którego ma być rozmieszczony ten pierwszy. Skrót C podczas zaznaczenia obu obiektów środkuje w pionie, podczas kiedy E - w poziomie.
Odnośnie makra, to rozumiem, że chodzi o dużo elementów, które mają trafić do wielu kwadratów? To mógłbyś nagrać takie zaznaczanie i środkowanie, a potem wrzucić to w pętlę. Chociaż trzeba by pokombinować jak to zrobić, żeby zaznaczał kolejne elementy i kolejne kwadraty... Ale pewno jest to do zrobienia. |
|
|
|
|
marek_maro
Początkujący
Dołączył: 20 Mar 2009 Posty: 7 Skąd: Gorzów Wlkp.
|
Wysłany: 30 Czerwiec 2014, 15:37
|
|
|
Można powiedzieć, że dokładnie taką samą teorię mam w głowię jednak chodzi o "automatykę" tego co miałbym zrobić ręcznie i zaoszczędzenie trochę czasu ;) |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 8 Lipiec 2014, 21:16 Tajne taśmy VBA
|
|
|
Najprościej z punktu widzenia kodu to wygląda tak:
Kod: | Sub PutCircleIntoRect()
On Error GoTo theend
CorelDRAW.Optimization = True
ActiveDocument.BeginCommandGroup "PutCircleIntoRect"
Dim circles As ShapeRange
Dim rects As ShapeRange
Set circles = ActiveLayer.FindShapes(Type:=cdrEllipseShape)
Set rects = ActiveLayer.FindShapes(Type:=cdrRectangleShape)
If circles.Count = 0 Then Exit Sub
If rects.Count = 0 Then Exit Sub
Dim cnt As Integer, i As Integer
If circles.Count > rects.Count Then
cnt = rects.Count
Else
cnt = circles.Count
End If
For i = 1 To cnt
With rects(i)
circles(i).SetPosition .PositionX + .SizeWidth / 2 - circles(i).SizeWidth / 2, .PositionY - .SizeHeight / 2 + circles(i).SizeHeight / 2
End With
Next i
theend:
ActiveDocument.EndCommandGroup
CorelDRAW.Optimization = False
CorelDRAW.Refresh
If Err.Description <> "" Then
MsgBox "Wystąpił błąd: " & Err.Description, vbCritical, Err.Source
Else
MsgBox "Zadanie wykonane!", vbInformation, "Sukces!"
End If
End Sub |
Działa tylko na elipsach i prostokątach, nie skaluje i nie sprawdza wymiarów.
SOA#1 jeśli coś jest nie tak to pewnie coś źle dodałem lub odjąłem.
Grupowanie i optymalizację polecam używać tak jak napisałem w kodzie tj. z etykietą theend bo jeśli wystąpi błąd w kodzie i makro się zatrzyma i bez odpalenia edytora vba i wywołania zakończenia optymalizacji konieczne będzie zamknięcie Corela. Najwięcej problemów sprawia zagnieżdżone grupowanie które bardzo miesza w Corelu i ciężko później pracować. Trzeba więc pamiętać by:
Szaman napisał/a: | Przed użyciem optymalizacji oddtańczyć odpowiedni rytuał, zapisać otwarte dokumenty lub skontaktować się z plemiennym szamanem. Bo każda optymalizacja i grupowanie niewłaściwie stosowane zagrażają twojemu życiu i zdrowiu psychicznemu. |
Rozmieszcza zgodnie z kolejnością w warstwie tj. z indeksami znalezionych obiektów. Sortowania nie chciało mi się robić bo oile sortowanie po jednym wymiarze jest bardzo proste, o tyle po 2 wymiarach (wysokość i szerokość) jest już trochę gorsze w realizacji. |
|
|
|
|
marek_maro
Początkujący
Dołączył: 20 Mar 2009 Posty: 7 Skąd: Gorzów Wlkp.
|
Wysłany: 9 Lipiec 2014, 07:58
|
|
|
Bardoz dziękuję dzisiaj przetestuje makro :) |
|
|
|
|
tomek123
Bywalec tomek123
Wersja CorelDRAW: X7
Pomógł: 8 razy Dołączył: 06 Gru 2014 Posty: 34 Skąd: Tychy
|
Wysłany: 3 Maj 2015, 22:35
|
|
|
Rozkłada dowolne obiekty (zaznaczone) na osi X od lewej do prawej w kolejności wysokości na warstwie (od najniższego obiektu do najwyższego albo na odwrót, nieistotne)
Przyda się może bardziej, niż to zadanko w zapytaniu.
Ja używam bardzo często, np. importuję sobie 10 plików png w jedno miejsce, a potem rozkładam w poziomie, dla podglądu.
Nie wiem, dlaczego w standardzie Corel nie ma takiej funkcjonalności, bardzo podstawowa (a może ma?!?, nie szukałem tak dokładnie)
Kod: |
'Rozłożenie zaznaczonych obiektów na osi X
Public Sub Spread_shapes()
Dim s As Shape, i As Integer, w As Double, x As Double, y As Double
If ActiveSelection.SizeWidth = 0 Then
MsgBox "Zaznacz obiekty do rozlozenia!!!"
Exit Sub
Optimization = True
i = 0
For Each s In ActiveSelection.Shapes
If i > 0 Then
x = (x + w)
s.SetPosition x, y
w = s.SizeWidth
Else
y = s.PositionY
x = s.PositionX
w = s.SizeWidth
End If
i = i + 1
Next
Optimization = False
ActiveWindow.Refresh
End Sub
|
A poniższy kod rozkłada obiekty wg założeń z tego tematu, więc zaznaczone obiekty wrzuca w ramki
- zbyt mało było założeń w pytaniu, więc ustaliłem, że ramka to każdy niewypełniony prostokąt w dokumencie, makro obsługuje do 999 ramek w dokumencie, co mozna oczywiście zwiekszyć, ale chyba nie ma takiej konieczności
- założyłem, że ramki to nie krzywe, tylko każdy zwykły niewypełniony prostokąt o dowolnym rozmiarze, piszę bo wiem, że niektórzy maja z tym problem;)
- makro nie dopasowuje rozmiarów zaznaczonych obiektów do ramki, tylko je centruje, takie były dane w temacie.
- jeżeli zaznaczony obiekt jest zgrupowany, to traktuje go jako jeden obiekt (to chyba bardziej funkcjonalne, choc można to zmienić)
Kod: |
'Rozłożenie zaznaczonych obiektów w prostokatach bez wypełnienia (ramki)
Public Sub Spread_shapes_in_rectangle()
Dim s As Shape, sr As ShapeRange, i As Integer, j As Integer, x As Double, y As Double
If ActiveSelection.SizeWidth = 0 Then
MsgBox "Zaznacz obiekty do rozlozenia w ramkach!!!"
Exit Sub
End If
Set sr = ActivePage.Shapes.FindShapes(Query:="@type = 'rectangle' and @fill.type = 'none'")
If sr.count = 0 Then
MsgBox "Brak ramek w dokumencie." & vbCr & "Stwórz za pomoca narzedzia prostokat [F6] i nie wypalniaj kolorem."
Exit Sub
End If
Optimization = True
i = 0
For Each s In sr
s.name = "ramka" & Format(i, "000")
s.OrderToBack
i = i + 1
Next s
j = 0
For Each s In ActiveSelection.Shapes.All
If j = i Then
MsgBox "Za malo ramek na zaznaczone obiekty!!!"
GoTo door:
End If
Set sr = ActivePage.Shapes.FindShapes(Query:="@name = '" & "ramka" & Format(j, "000") & "'")
x = sr.CenterX
y = sr.CenterY
s.CenterX = x
s.CenterY = y
j = j + 1
Next
door:
Optimization = False
ActiveWindow.Refresh
End Sub
|
|
|
|
|
|
tegraf
Ekspert tegraf
Pomógł: 74 razy Dołączył: 21 Mar 2011 Posty: 1954 Skąd: Zielona Góra
|
Wysłany: 4 Maj 2015, 06:28
|
|
|
A to makro nie może sobie samo narysować brakujących ramek? Zmuszanie użytkownika który chce w ten sposób rozmieścić 300 elementów do narysowania 300 prostokątów - nie wygląda dobrze. Narysowanie niewypełnionego prostokąta przez makro w odpowiednim momencie nie powinno stanowić problemu. |
|
|
|
|
tomek123
Bywalec tomek123
Wersja CorelDRAW: X7
Pomógł: 8 razy Dołączył: 06 Gru 2014 Posty: 34 Skąd: Tychy
|
Wysłany: 4 Maj 2015, 14:39
|
|
|
To nie jest problem, tylko założyłem, że autor tematu ma już ramki, więc nie chciałem być nadgorliwy ;) Dodatkowo nie napisał jak mają one być rozłożone i jakie maja mieć wymiary, więc stwierdziłem, że sam sobie to zrobi, skoro to nie gra roli.
Stworzenie prostokąta to metoda 'CreateRectangle' - wystarczy dołożyć do kodu i uruchomić warunkowo, jak brakuje ramek...
Jak chcesz takie makro, to jak będe miał chwilkę czasu to je rozbuduję... |
|
|
|
|
tegraf
Ekspert tegraf
Pomógł: 74 razy Dołączył: 21 Mar 2011 Posty: 1954 Skąd: Zielona Góra
|
Wysłany: 4 Maj 2015, 15:23
|
|
|
tomek123 napisał/a: | Jak chcesz takie makro, to jak będe miał chwilkę czasu to je rozbuduję... |
Nie, nie potrzebuję. Dziękuję jednak za chęci. W sumie to witamy na forum. |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 10 Maj 2015, 00:41
|
|
|
Każdy obrazek w Corelu da się narysować makrem, ciekawe dlaczego ludzie tak nie robią? |
|
|
|
|
|
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
|
|
|
|
|
|
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.09 sekundy. Zapytań do SQL: 14 |
|
|