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
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, 18: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, 19: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, 16: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, 22: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, 08: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, 23: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, 07: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, 15: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, 16: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, 01:41   

Każdy obrazek w Corelu da się narysować makrem, ciekawe dlaczego ludzie tak nie robią?
 
 
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.
 

ABC CorelDRAW X7 PL

ABC CorelDRAW X7 PL
Roland Zimek

Cena: 39.90 z�

dodaj do koszyka
zobacz opis

 

CorelDRAW X7 PL. �wiczenia praktyczne

CorelDRAW X7 PL. �wiczenia praktyczne
Roland Zimek

Cena: 27.00 z�

dodaj do koszyka
zobacz opis

 

Corel PaintShop Pro X4. Obr�bka zdj�� cyfrowych. �wiczenia praktyczne

Corel PaintShop Pro X4. Obr�bka zdj�� cyfrowych. �wiczenia praktyczne
Roland Zimek

Cena: 34.90 z�

dodaj do koszyka
zobacz opis

 

Adobe Premiere Pro. Oficjalny podr�cznik

Cena: 80.00 z�
Dodaj do koszyka

 

JavaScript od pierwszej linii kodu. Błyskawiczna nauka pisania gier, stron WWW i aplikacji internetowych

JavaScript od pierwszej linii kodu. Błyskawiczna nauka pisania gier, stron WWW i aplikacji internetowych
Laurence Lars Svekis, Maaike van Putten, Rob Percival

Cena: 49.50 zł
zobacz opis

Strona wygenerowana w 0.09 sekundy. Zapytań do SQL: 10