|
Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych
|
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ę. |
|
|
|
|
|
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.11 sekundy. Zapytań do SQL: 14 |
|
|