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
Makro do oczkowania banerów
Autor Wiadomość
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 7 Luty 2015, 16:48   Makro do oczkowania banerów

Zlecę wykonania makra, które oznaczy na bitmapie lub grupie obiektów oczka i linie cięcia - już tłumaczę jak mogłoby to wyglądać.

Zaznaczamy obiekt a skrypt doda nam obrys powiększony z każdej strony o 3 cm i oznaczy miejsca oczkowania co około 50 cm odsunięte od krawędzi o 1,5 cm (lub wartości, które wprowadzimy - fajnie gdyby dało się za każdym razem wprowadzić korektę - popup).

Załączam podgląd jak miałby wyglądać wynik.

baner_przyklad.jpg
Przykładowy plik wynikowy.
Pobierz Plik ściągnięto 711 raz(y) 169.34 KB

 
 
tegraf 
Ekspert
tegraf


Pomógł: 74 razy
Dołączył: 21 Mar 2011
Posty: 1954
Skąd: Zielona Góra
Wysłany: 7 Luty 2015, 20:07   

Po co ten 3 cm obrys, skoro "oczka" nie są w nim rysowane? Tak ma być - czy to błąd w rysunku?
 
 
Cysorz 



Pomógł: 205 razy
Dołączył: 01 Sty 2011
Posty: 3137
Skąd: Kraków
Wysłany: 7 Luty 2015, 20:27   

Na zawinięcie?
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 8 Luty 2015, 18:10   

Tak, to jest to co zawiniemy na tył i zgrzejemy. Oczka oznaczyłem od przodu bo tak później oczkujemy.
 
 
tegraf 
Ekspert
tegraf


Pomógł: 74 razy
Dołączył: 21 Mar 2011
Posty: 1954
Skąd: Zielona Góra
Wysłany: 8 Luty 2015, 20:35   

Jaka jest odległość między oczkami (i ile ich jest) na długości 125 cm?
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 8 Luty 2015, 20:42   

4 co 40,6 cm, ponieważ przy 3 oczkach wyszły by co 60 cm - więc skrypt musi ocenić średnią.
 
 
dj_maras 
Ekspert



Pomógł: 8 razy
Dołączył: 09 Lut 2012
Posty: 852
Skąd: WOLSZTYN
Wysłany: 8 Luty 2015, 20:43   

ja nie rozumiem.... eksportując projekt do jpg który idzie na baner, takie kółka rusyję w 30sek... po co makro ?
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 8 Luty 2015, 20:43   

Pierwsze i ostatnie oczko odsunięte jest od krawędzi o połowę wartości zawijki (mam na myśli środek tego oczka).
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 8 Luty 2015, 20:46   

Jeśli mam takich plików dziennie kilkadziesiąt to zajmuje kupę czasu a ręczna robota nie zajmuje 30 sek.
 
 
dj_maras 
Ekspert



Pomógł: 8 razy
Dołączył: 09 Lut 2012
Posty: 852
Skąd: WOLSZTYN
Wysłany: 8 Luty 2015, 22:06   

a jakiej wielkości banery drukujesz ??? bo to istotne...????
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 9 Luty 2015, 10:04   

Od 1x1 do 3x10 standardowo a bywa, że 10x20 (zgrzewane).
 
 
tegraf 
Ekspert
tegraf


Pomógł: 74 razy
Dołączył: 21 Mar 2011
Posty: 1954
Skąd: Zielona Góra
Wysłany: 9 Luty 2015, 11:29   

Wydruk jest z Corela czy z pdfa?
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 9 Luty 2015, 11:32   

Robimy eksport do TIFa z kompresją LZW.

Co do importu to chciałbym oczkować grupę obiektów lub wcześniej zaimportowaną bitmapę (jpg lub tiff), którą otrzymałem od klienta.
 
 
chezare 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 9 Luty 2015, 21:05   

DJ ma rację, to się da zrobić ręcznie może nie w 30 s, ale w niewiele dłuższym czasie.
Jak założyć, że strona ma rozmiar banera (gotowego), to napisanie takiego makra jest prymitywnym zadaniem, tak mi się wydaje? :-)
 
 
kvision
Bywalec


Dołączył: 28 Sty 2011
Posty: 48
Skąd: Opolskie
Wysłany: 10 Luty 2015, 15:59   

Jakby ktoś chciał to dostałem takie makro od znajomego, nazywa się AP EyeletMarking.

Do pobrania stąd.
 
 
tomek123
Bywalec
tomek123


Wersja CorelDRAW: X7
Pomógł: 8 razy
Dołączył: 06 Gru 2014
Posty: 34
Skąd: Tychy
Wysłany: 12 Maj 2015, 01:03   

Proste problemy są najbardziej popaprane heh..
ale dobry rebus na rozgrzewkę ;)
Wystarczy 30 sekund, dobre, to zrób to w 30 sekund...
Jak masz jeden banner do zrobienia na dzień, to nie problem, ale jak 100 to już prawie godzina, (choć ja obstawiam dniówka) a godziny szkoda, mi przynajmniej... i jaka żmudna robota...
ale gdybym robił na dzień jeden banner to też bym makro napisał, tak dla picu..

Kod:

Public Sub Oczkowanie()
Dim i As Integer, s As Shape, p_ellipse As Shape, _
x As Double, y As Double, w As Double, h As Double, _
x_wew As Double, y_wew As Double, w_wew As Double, h_wew As Double, _
x_zew As Double, y_zew As Double, w_zew As Double, h_zew As Double, _
il_w_oczek As Integer, il_h_oczek As Integer, _
w_oczka As Double, h_oczka As Double, _
w_odl As Double, h_odl As Double, _
x1 As Double, x2 As Double, y1_up As Double, y1_down As Double, y2_up As Double, y2_down As Double, _
y1 As Double, y2 As Double, x1_left As Double, x1_right As Double, x2_left As Double, x2_right As Double, _
shift As Double, space As Double

Set s = ActiveSelection
    If s.SizeWidth = 0 Then
    MsgBox "Zaznacz banner"
    Exit Sub
End If
space = InputBox("Podaj odleglosc srodka oczka od krawedzi w [mm]", "Odleglosc oczka od krawedzi", 15)
space = space / 10
Optimization = True
ActiveDocument.Unit = cdrCentimeter
x = s.PositionX
y = s.PositionY
w = s.SizeWidth
h = s.SizeHeight
x_zew = x - 3
y_zew = y + 3
w_zew = w + 6
h_zew = h + 6
x_wew = x + space
y_wew = y - space
w_wew = w - (2 * space)
h_wew = h - (2 * space)
ActiveLayer.CreateRectangle(x_zew, y_zew, x_zew + w_zew, y_zew - h_zew).OrderToBack
il_w_oczek = Round(w_wew / 50 + 0.5)
il_h_oczek = Round(h_wew / 50 + 0.5)
w_oczka = 1
h_oczka = 1
w_odl = w_wew / il_w_oczek
h_odl = h_wew / il_h_oczek
    x1 = x_wew - (w_oczka / 2)
    x2 = x_wew + (w_oczka / 2)
    y1_up = y_wew + (h_oczka / 2)
    y1_down = y_wew - h_wew + (h_oczka / 2)
    y2_up = y_wew - (h_oczka / 2)
    y2_down = y_wew - h_wew - (h_oczka / 2)
For i = 0 To il_w_oczek
    shift = i * w_odl
    Set p_ellipse = ActiveLayer.CreateEllipse(x1 + shift, y1_up, x2 + shift, y2_up)
    fill_ellipse p_ellipse
    Set p_ellipse = ActiveLayer.CreateEllipse(x1 + shift, y1_down, x2 + shift, y2_down)
    fill_ellipse p_ellipse
Next i
    x1_left = x_wew - (w_oczka / 2)
    x1_right = x_wew + w_wew - (w_oczka / 2)
    x2_left = x_wew + (w_oczka / 2)
    x2_right = x_wew + w_wew + (w_oczka / 2)
    y1 = y_wew + (h_oczka / 2)
    y2 = y_wew - (h_oczka / 2)
For i = 1 To il_h_oczek - 1
    shift = i * h_odl
    Set p_ellipse = ActiveLayer.CreateEllipse(x1_left, y1 - shift, x2_left, y2 - shift)
    fill_ellipse p_ellipse
    Set p_ellipse = ActiveLayer.CreateEllipse(x1_right, y1 - shift, x2_right, y2 - shift)
    fill_ellipse p_ellipse
Next i
Optimization = False
ActiveWindow.Refresh
End Sub

Private Function fill_ellipse(p_ellipse As Shape)
p_ellipse.Outline.Color.RGBAssign 0, 0, 0
p_ellipse.Outline.width = 0.05
p_ellipse.Fill.UniformColor.RGBAssign 0, 0, 0
End Function
 
 
tegraf 
Ekspert
tegraf


Pomógł: 74 razy
Dołączył: 21 Mar 2011
Posty: 1954
Skąd: Zielona Góra
Wysłany: 12 Maj 2015, 09:41   

Dobry początek. Przydałby się jakiś interfejs, gdzie można by wprowadzić więcej parametrów, a nie tylko odległość środka oczka od krawędzi.

Co liczy ten wiersz, gdy h_wew < 50?
Kod:
il_h_oczek = Round(h_wew / 50 + 0.5)
 
 
tomek123
Bywalec
tomek123


Wersja CorelDRAW: X7
Pomógł: 8 razy
Dołączył: 06 Gru 2014
Posty: 34
Skąd: Tychy
Wysłany: 12 Maj 2015, 21:11   

kvision napisał/a:
Od 1x1 do 3x10 standardowo a bywa, że 10x20 (zgrzewane).


skoro kvision projektuje bannery od minimum metr x metr , a w założeniu oczka maja być max od siebie 50cm to nic nie musiałoby obliczać, bo mu to niepotrzebne, ale w sumie przypadkowo zawsze wstawia cztery oczka w narożnikach, nawet jak banner jest mniejszy niż 50x50cm.

Chciał tylko manipulować (ewentualnie) odległością oczka od krawędzi, co jest uwzględnione.

Banner ma w dokumencie, więc go nie tworzę (musi być zgrupowany, jak zawiera jakieś inne elementy wewnatrz), ramkę na skład ma zawsze w tym samym rozmiarze - (3cm od krewędzi), więc nie trzeba ustalać tej wielkości.

Można ustalać szerokość oczka (ja założyłem 1cm) - (pewnie oczko zawsze ma taką samą szerokość, choć niekoniecznie) i to może sobie zmienić bezpośrednio w kodzie na stałe - w linijkach:
Kod:

w_oczka = 1
h_oczka = 1


albo wprowadzać za każdym razem zastępując te linijki kodem:
Kod:

w_oczka = InputBox("Podaj szerokość oczka [mm]", "Szerokość oczka", 10)/10
h_oczka = w_oczka 'przy założeniu, że oczko jest okręgiem
 
 
jarekpiotrowicz 
Początkujący


Dołączył: 19 Paź 2015
Posty: 5
Skąd: Tarnów
Wysłany: 19 Październik 2015, 21:43   

A ja mam jeszcze takie pytanie.

Skoro zmienna:
"ActiveLayer.CreateRectangle(x_zew, y_zew, x_zew + w_zew, y_zew - h_zew).OrderToBack "
odpowiada za narysowanie prostokąta, który jest większy o 3 cm z każdego boku, to jak narysować drugi taki prostokąt, który z kolei będzie równy wielkości bannera?
Przydałby się taki prostokąt w przypadku, gdy tło bannera jest białe, bo taka ramka bardzo pomaga przy równym zgrzewaniu. Nie potrafię ogarnąć tych zmiennych x_zew, y_zew, itp.
Próbowałem już chyba wszystkiego i ciągle mi się makro wyburacza :)
 
 
tomek123
Bywalec
tomek123


Wersja CorelDRAW: X7
Pomógł: 8 razy
Dołączył: 06 Gru 2014
Posty: 34
Skąd: Tychy
Wysłany: 19 Październik 2015, 22:11   

Kod:
ActiveLayer.CreateRectangle(x, y, x + w, y - h).OrderToFront

najlepiej po tej linijce, którą wypisałeś
 
 
jarekpiotrowicz 
Początkujący


Dołączył: 19 Paź 2015
Posty: 5
Skąd: Tarnów
Wysłany: 19 Październik 2015, 22:33   

No i o to chodziło, dzięki wielkie!
 
 
jarekpiotrowicz 
Początkujący


Dołączył: 19 Paź 2015
Posty: 5
Skąd: Tarnów
Wysłany: 20 Październik 2015, 08:22   

Tomku, mogę mieć jeszcze prośbę o pomoc?
Teraz dopiero zaczynam się wdrażać w makra, ale moja wiedza wciąż opiera się na jakichś samplach z Internetu i nie daję rady...
Podrążę jeszcze temat tego makra do oczkowania. Po pierwsze wprowadziłem delikatne modyfikacje:
- zmniejszyłem średnicę oczek do 8 mm, bo 10 troszkę za duże, zwłaszcza, jak osoba oczkująca nie trafi idealnie.
- zmniejszyłem też grubość linii do 0,2 mm
- zmieniłem wypełnienie oczek, żeby były białe, ponieważ jeśli banner jest czarny, to wtedy oczek nie widać.
- wprowadziłem dodatkową ramkę, w przypadku gdy tło bannera jest biała (dzięki)

Oto zmienione makro:

Kod:
Public Sub Oczkowanie()
Dim i As Integer, s As Shape, p_ellipse As Shape, _
x As Double, y As Double, w As Double, h As Double, _
x_wew As Double, y_wew As Double, w_wew As Double, h_wew As Double, _
x_zew As Double, y_zew As Double, w_zew As Double, h_zew As Double, _
il_w_oczek As Integer, il_h_oczek As Integer, _
w_oczka As Double, h_oczka As Double, _
w_odl As Double, h_odl As Double, _
x1 As Double, x2 As Double, y1_up As Double, y1_down As Double, y2_up As Double, y2_down As Double, _
y1 As Double, y2 As Double, x1_left As Double, x1_right As Double, x2_left As Double, x2_right As Double, _
shift As Double, space As Double

Set s = ActiveSelection
    If s.SizeWidth = 0 Then
    MsgBox "Zaznacz banner"
    Exit Sub
End If
space = 24
space = space / 10
Optimization = True
ActiveDocument.Unit = cdrCentimeter
x = s.PositionX
y = s.PositionY
w = s.SizeWidth
h = s.SizeHeight
x_zew = x - 3
y_zew = y + 3
w_zew = w + 6
h_zew = h + 6
x_wew = x + space
y_wew = y - space
w_wew = w - (2 * space)
h_wew = h - (2 * space)
ActiveLayer.CreateRectangle(x_zew, y_zew, x_zew + w_zew, y_zew - h_zew).OrderToBack
ActiveLayer.CreateRectangle(x, y, x + w, y - h).OrderToFront
ActiveLayer.CreateArtisticText(x + 5, y + 1, "PODPISPODPISPODPIS").OrderToFront
il_w_oczek = Round(w_wew / 50 + 0.5)
il_h_oczek = Round(h_wew / 50 + 0.5)
w_oczka = 0.8
h_oczka = 0.8
w_odl = w_wew / il_w_oczek
h_odl = h_wew / il_h_oczek
    x1 = x_wew - (w_oczka / 2)
    x2 = x_wew + (w_oczka / 2)
    y1_up = y_wew + (h_oczka / 2)
    y1_down = y_wew - h_wew + (h_oczka / 2)
    y2_up = y_wew - (h_oczka / 2)
    y2_down = y_wew - h_wew - (h_oczka / 2)
For i = 0 To il_w_oczek
    shift = i * w_odl
    Set p_ellipse = ActiveLayer.CreateEllipse(x1 + shift, y1_up, x2 + shift, y2_up)
    fill_ellipse p_ellipse
    Set p_ellipse = ActiveLayer.CreateEllipse(x1 + shift, y1_down, x2 + shift, y2_down)
    fill_ellipse p_ellipse
Next i
    x1_left = x_wew - (w_oczka / 2)
    x1_right = x_wew + w_wew - (w_oczka / 2)
    x2_left = x_wew + (w_oczka / 2)
    x2_right = x_wew + w_wew + (w_oczka / 2)
    y1 = y_wew + (h_oczka / 2)
    y2 = y_wew - (h_oczka / 2)
For i = 1 To il_h_oczek - 1
    shift = i * h_odl
    Set p_ellipse = ActiveLayer.CreateEllipse(x1_left, y1 - shift, x2_left, y2 - shift)
    fill_ellipse p_ellipse
    Set p_ellipse = ActiveLayer.CreateEllipse(x1_right, y1 - shift, x2_right, y2 - shift)
    fill_ellipse p_ellipse
Next i
Optimization = False
ActiveWindow.Refresh
End Sub

Private Function fill_ellipse(p_ellipse As Shape)
p_ellipse.Outline.Color.RGBAssign 0, 0, 0
p_ellipse.Outline.Width = 0.02
p_ellipse.Fill.UniformColor.RGBAssign 255, 255, 255
End Function



Mam jednak jeden problem. U nas w firmie drukujemy dość dużo bannerów, więc każdy banner opisujemy. Opis bannera zawsze znajduje się na lewym boku i jest nazwą pliku klienta. Opis musi znajdować się w rogu, ale nie na wysokości oczka, ponieważ po zaoczkowaniu część napisu zniknie.
Oczywiście, makro w Corelu nie poradzi sobie z wygenerowaniem właściwego tekstu, ponieważ Corel nie bedzie wiedział jak nazywa się plik, który wcześniej zaimportowałem do Corela. Ale mi w zupełności wystarczy dowolny obiekt tekstowy, ważne tylko aby był we właściwym miejscu i w odpowiedniej wielkości (Arial 12). Po uruchmieniu makra i wygenerowaniu ramek, oczek oraz obiektu tekstowego, po prostu kliknę dwa razy w ten obiekt i wprowadzę właściwy tekst bez potrzeby definiowania wielkości, umiejscowienia i rotacji obiektu tekstowego.
Utworzyłem wiersz, dzięki któremu generowany jest tekst ozdobny "PODPISPODPISPODPIS":

Kod:
ActiveLayer.CreateArtisticText(x + 5, y + 1, "PODPISPODPISPODPIS").OrderToFront


Umiejscowienie względem oczek jest idealne, jednak nie potrafię poradzić sobie z dwiema zmiennymi:

1) Jak zmienić tekst aby nie generował czcionki wielkości 24 punktów, tylko 12 punktów?
2) Jak zrobić, aby ten tekst został obrócony w lewo o 90 stopni i leżał na lewej krawędzi (zgrzewie) bannera?

Poniżej zrzut ekranu z lewym górnym wycinkiem bannera. Duży czarny tekst to opis, który uzyskałem, wielkości 24 punktów.
Napis na czerwono to mój cel, który chciałbym uzyskać :) Czyli czcionka 12 punktów, obrócona i umiejscowiona na lewej krawędzi zgrzewu:

 
 
chezare 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 20 Październik 2015, 15:00   

Ja się na tym nie znam, ale to by było jakoś tak:

ActiveLayer.CreateArtisticText(x, y, "INFORMACJE O PLIKU", , , "Arial", 12, cdrFalse, , , cdrRightAlignment).Rotate 90#

Tylko musisz wykombinować jak umieścić go w odpowiednim miejscu.
Dzięki wyrównaniu do prawej obiekt powinien być odporny na zmienną długość tekstu.
Jeśli nazwa dokumentu byłaby np. taka sama jak tekst który chcesz tam wpisywać, to można by to zautomatyzować tak żebyś nic nie musiał z tym "ręcznie" robić.
Wydaje mi się też, że o wiele łatwiej byłoby umiejscowić ten tekst gdyby był akapitowy, a nie artystyczny, bo wtedy rysujesz ramkę tekstu o szerokości wysokości banera, wyrównujesz w niej tekst do prawej, obracasz o 90 stopni i umiejscawiasz przy lewej stronie, np. tak:

ActiveLayer.CreateParagraphText(-y / 2 + 5, y / 2 - 1, y / 2 - 2, y / 2 + 1, ActiveDocument.Name, , , "Arial", 12, , , , cdrRightAlignment).Rotate 90#

gdzie y to wysokość strony w centymetrach.
Ostatnio zmieniony przez chezare 20 Październik 2015, 16:06, w całości zmieniany 1 raz  
 
 
jarekpiotrowicz 
Początkujący


Dołączył: 19 Paź 2015
Posty: 5
Skąd: Tarnów
Wysłany: 20 Październik 2015, 15:59   

Działa, wielkie dzięki :)
Już sobie spozycjonowałem prawidłowo:

Kod:
ActiveLayer.CreateArtisticText(x + 1, y - 10, "PODPISPODPISPODPIS", , , "Arial", 12, cdrFalse, , , cdrRightAlignment).Rotate 90#
 
 
chezare 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 20 Październik 2015, 16:19   

Jak wpiszesz bardzo długi tekst to nie wylezie za baner?
Wydaje mi się, że od X3 zmiana wyrównania nie wpływa na pozycję tekstu, ale we wcześniejszych wersjach zmienia on pozycję.
 
 
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.12 sekundy. Zapytań do SQL: 15