Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych

Makra - Makro do oczkowania banerów

kvision - 7 Luty 2015, 16:48
Temat postu: 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.

tegraf - 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 - 7 Luty 2015, 20:27

Na zawinięcie?
kvision - 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 - 8 Luty 2015, 20:35

Jaka jest odległość między oczkami (i ile ich jest) na długości 125 cm?
kvision - 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 - 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 - 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 - 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 - 8 Luty 2015, 22:06

a jakiej wielkości banery drukujesz ??? bo to istotne...????
kvision - 9 Luty 2015, 10:04

Od 1x1 do 3x10 standardowo a bywa, że 10x20 (zgrzewane).
tegraf - 9 Luty 2015, 11:29

Wydruk jest z Corela czy z pdfa?
kvision - 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 - 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 - 10 Luty 2015, 15:59

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

Do pobrania stąd.

tomek123 - 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 - 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 - 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 - 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 - 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 - 19 Październik 2015, 22:33

No i o to chodziło, dzięki wielkie!
jarekpiotrowicz - 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 - 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.

jarekpiotrowicz - 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 - 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ę.

jarekpiotrowicz - 20 Październik 2015, 18:12

Nie, jest super.
OutsiderEg - 18 Październik 2021, 07:14

Podepnę się pod pościk co prawda czerstwy już od jakiegoś czasu, ale dotyczy on makra które tu się znajduje.

Czy jest możliwość, a domniemam że pewnie jest dopisania tego i owego aby dane makro w miejscu czarnych kropek tworzyło ich kopię lecz z konturem M 100.
Nie używam makr w sposób który uświadomił mnie co do ich edycji oraz tworzenia.

Jedyne co zmieniłem to kolor z RGB na CMYK (w takiej palecie pracuję)
Jednym słowem podwójne kropkowanie (dublowanie) o innych kolorach.

Private Function fill_ellipse(p_ellipse As Shape)
p_ellipse.Outline.Color.CMYKAssign 0, 100, 0, 0
p_ellipse.Outline.Width = 0.05
p_ellipse.Fill.UniformColor.CMYKAssign 0, 0, 0, 0

Załączam PDf-a w celu zwizualizowania o co się rozchodzi.

TheMan258 - 9 Listopad 2021, 20:01

Witaj,
myślę, że to zadziała:
Kod:
Dim i As Integer, s As Shape, p_ellipse As Shape, m_ellipse As Shape, _

Kod:
For i = 0 To il_w_oczek
    shift = i * w_odl
    Set m_ellipse = ActiveLayer.CreateEllipse(x1 + shift, y1_up, x2 + shift, y2_up)
    fill_ellipse1 m_ellipse
    Set m_ellipse = ActiveLayer.CreateEllipse(x1 + shift, y1_down, x2 + shift, y2_down)
    fill_ellipse1 m_ellipse
    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

Kod:
Private Function fill_ellipse1(m_ellipse As Shape)
m_ellipse.Outline.Color.CMYKAssign 0, 100, 0, 0
m_ellipse.Outline.Width = 0.05
m_ellipse.Fill.UniformColor.CMYKAssign 0, 0, 0, 0
End Function

lub ręcznie jako osobne makro
Kod:
Dim OS As ShapeRange, s As Shape
Set OS = ActiveSelectionRange
Dim s1 As Shape
For Each s In OS

Set s1 = ActiveLayer.CreateEllipse(s.LeftX + 0, s.TopY - 0, s.RightX - 0, s.BottomY + 0)
s1.Outline.SetProperties Color:=CreateCMYKColor(0, 100, 0, 0)
Next s

OutsiderEg - 16 Listopad 2021, 11:59

Super robota. Ja na to nie wpadłem a siedziały przy tym głowy dwie,
Zmieniliśmy trochę sam kod - same pierdoły.

Wielkie dzięki za uzyskaną pomoc.TheMan258
Niech żyje Kraków.

Cały kod po naszych zmianach w załączniku.

labzap - 6 Lipiec 2023, 17:29
Temat postu: zmiana nazwy
A czy w tym makro jest opcja żeby zamiast podpispodpis wpisywał nazwę banneru pobraną z warstwy czyli tak jak nazywa się na warstwie żeby taka sama nazwa była wyświetlana?
OutsiderEg - 6 Lipiec 2023, 18:09

Pewnie makro takie istnieje. Lecz to nie to czego szukasz. Te makro dodajetylko kolka w skrajnych rogach ( do maszyny tnącej)

Powered by phpBB modified by Przemo © 2003 phpBB Group