|
Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych
|
dopasuj rozmiar strony do zaznaczonego elementu |
Autor |
Wiadomość |
michal.s
Praktyk
Wersja CorelDRAW: x4
Pomógł: 1 raz Dołączył: 01 Lut 2012 Posty: 66 Skąd: Poznań
|
Wysłany: 2 Lipiec 2012, 17:01 dopasuj rozmiar strony do zaznaczonego elementu
|
|
|
Dzień dobry Wszystkim.
Podczas kolejnej, setnej czynności dopasowania rozmiaru strony do zaznaczonego elementu, przypomniałem sobie, że istnieje to WSPANIAŁE Corel Forum i użytkownicy którzy już kilka razy mi pomogli (może i tym razem )
Czy jest możliwe przygotowanie makra, które jak pisałem wyżej dopasuje format strony do zaznaczonego elementu.
Podam przykład jak to przygotowuję dotychczas:
Zaznaczam grupę elementów o rozmiarze szerkość 250 wysokość 370 mm, zapisuję sobie wymiary na kartce (młodsi te informacje zapamiętują ), następnie wchodzę w parametry strony i wprowadzam wymiary, klikam ok i mam
A można to zrobić szybciej i z automatu.
Zarejestrowałem makro w Corelu X4, ale działa to tylko dla jednego rozmiaru
Kod: | Sub rozmiar_strony_1()
' Recorded 2012-07-02
Dim OrigSelection As ShapeRange
Set OrigSelection = ActiveSelectionRange
Windows.FindWindow("Rysunek2").ActiveView.SetViewPoint 1.968504, 3.937008, 100
With ActivePage
.SetSize 3.937008, 7.874016
.Orientation = cdrPortrait
.PrintExportBackground = True
.Bleed = 0#
.Background = cdrPageBackgroundNone
End With
End Sub |
|
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 11 Lipiec 2012, 12:49
|
|
|
Używam takiego czegoś na codzień w pracy. Mój kod poniżej...
Kod: | Sub WymiarKartki()
Dim dblWysokoscLogo As Double
Dim dblSzerokoscLogo As Double
ActiveDocument.Unit = cdrMillimeter
'ActivePage.Shapes.All.CreateSelection
ActiveSelection.Group
ActiveSelection.GetSize dblSzerokoscLogo, dblWysokoscLogo
ActiveSelection.AlignToPageCenter cdrAlignLeft + cdrAlignRight + cdrAlignTop + cdrAlignBottom, cdrTextAlignBoundingBox
ActiveSelection.UngroupEx
ActivePage.SetSize Round(dblSzerokoscLogo + 2, 0), Round(dblWysokoscLogo + 2, 0)
Dim wys As Double
Dim szer As Double
wys = ActivePage.SizeHeight
szer = ActivePage.SizeWidth
End Sub |
Pozdr,
MN |
|
|
|
|
michal.s
Praktyk
Wersja CorelDRAW: x4
Pomógł: 1 raz Dołączył: 01 Lut 2012 Posty: 66 Skąd: Poznań
|
Wysłany: 11 Lipiec 2012, 16:04
|
|
|
Martin Nez,
NIE WIEM JAK MAM TOBIE DZIĘKOWAĆ
Dokładnie o to mi chodziło.
Nawet nie wiesz jak bardzo przyspieszyłeś moją pracę
Jeszcze raz BARDZO TOBIE DZIĘKUJĘ |
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 12 Lipiec 2012, 05:21
|
|
|
Zapomniałem usunąć "2" z linii:
Kod: | ActivePage.SetSize Round(dblSzerokoscLogo + 2, 0), Round(dblWysokoscLogo + 2, 0) |
Dzięki nim możesz sobie regulować o ile mm ma być większa kartka.
Pozdr,
MN |
|
|
|
|
michal.s
Praktyk
Wersja CorelDRAW: x4
Pomógł: 1 raz Dołączył: 01 Lut 2012 Posty: 66 Skąd: Poznań
|
Wysłany: 13 Lipiec 2012, 18:46
|
|
|
:)
Dziękuję za informację. Teraz to dopiero jest automatyzacja :)
p.s. Osobne podziękowania dla Ciebie od moich współpracowników. |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 17 Lipiec 2012, 23:21 Szaman zaszamanił :)
|
|
|
Martin Nez napisał/a: | Używam takiego czegoś na codzień w pracy |
Po kodzie łatwo można wywnioskować, że to jest wycinek czegoś czego używasz, bo widać sporo pozostałości po różnych kombinacjach.
Posprzątałem kod i zrobiłem 2 wersje makra:
Kod: | Sub WymiarKartkiWarning()
Dim s As Shape
ActiveDocument.Unit = cdrMillimeter
If ActiveSelectionRange.Shapes.Count > 0 Then
Set s = ActiveSelectionRange.Group
Call s.AlignToPageCenter(cdrAlignHCenter + cdrAlignVCenter, cdrTextAlignBoundingBox)
Call ActivePage.SetSize(Math.Round(s.SizeWidth, 0), Math.Round(s.SizeHeight, 0))
s.Ungroup
Else
MsgBox "Musisz zaznaczyć elementy odniesienia", vbInformation, "Błąd!"
End If
End Sub |
Powyżej wersja ostrzegająca o konieczności zaznaczenia wszystkich (CTRL+A) lub wybranych elementów na stronie.
Kod: | Sub WymiarKartkiAuto()
Dim s As Shape
Dim sr As New ShapeRange
ActiveDocument.Unit = cdrMillimeter
Call sr.AddRange(ActivePage.Shapes.All)
Set s = sr.Group
Call s.AlignToPageCenter(cdrAlignHCenter + cdrAlignVCenter, cdrTextAlignBoundingBox)
Call ActivePage.SetSize(Math.Round(s.SizeWidth, 0), Math.Round(s.SizeHeight, 0))
s.Ungroup
End Sub |
Powyżej wersja automatycznie zaznaczająca wszystkie obiekty na stronie i dopasowująca wymiary do tego co wyjdzie.
Zamiast "cdrAlignLeft + cdrAlignRight + cdrAlignTop + cdrAlignBottom" wystarczy "cdrAlignHCenter + cdrAlignVCenter" co w tym konkretnym przypadku zadziała dokładnie tak samo.
Osobiście rzadko już używam VBA więc piszę Call zamiast wywoływać metodę bez nawiasów. Później jak chcę się przenieść na VB.NET to tego mi nie poprawia... wyjątek stanowi msgbox która to metoda ładnie się poprawia z automatu (przeważnie). |
|
|
|
|
michal.s
Praktyk
Wersja CorelDRAW: x4
Pomógł: 1 raz Dołączył: 01 Lut 2012 Posty: 66 Skąd: Poznań
|
Wysłany: 19 Lipiec 2012, 10:25
|
|
|
A czy mógłbym poprosić o lekkie zmodyfikowanie kodu
A mianowicie, jeżeli rozmiar elementu jest 100/100 mm to dopasowanie strony jest dokładnie takie.
Ale jeżeli element ma wymiar 99,4/99,4 mm to wymiar strony zaokrąglony zostaje do 99/99 mm |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 19 Lipiec 2012, 11:55
|
|
|
michal.s napisał/a: | wymiar 99,4/99,4 mm to wymiar strony zaokrąglony zostaje do 99/99 mm |
Hmmm.... to właśnie pokazuje jak ograniczone jest VBA w stosunku nawet do VB6 bo nie ma tu funkcji sufit, a jest tylko zwykłe zaokrąglanie.
Kiedyś już pisałem funkcję sufit dla VBA, ale gdzieś mi zniknęła więc napisałem nową, pewnie inaczej niż poprzednio, ale ważne że działa:
Kod: | Public Function Ceiling(ByVal x As Double) As Double
Ceiling = Int(x) + IIf(x - Int(x) > 0, 1, 0)
End Function |
Funkcja dodaje 1 jeśli po przecinku jest dowolna wartość większa od 0. Tak właśnie działa funkcja sufit czyli zaokrąglanie w górę.
int(x) to poprostu funkcja podłoga z x czyli część całkowita.
Po dodaniu w kodzie wymienionej wyżej funkcji mamy:
Kod: | Sub WymiarKartkiWarning()
Dim s As Shape
ActiveDocument.Unit = cdrMillimeter
If ActiveSelectionRange.Shapes.Count > 0 Then
Set s = ActiveSelectionRange.Group
Call s.AlignToPageCenter(cdrAlignHCenter + cdrAlignVCenter, cdrTextAlignBoundingBox)
Call ActivePage.SetSize(Ceiling(s.SizeWidth), Ceiling(s.SizeHeight))
s.Ungroup
Else
MsgBox "Musisz zaznaczyć elementy odniesienia", vbInformation, "Błąd!"
End If
End Sub |
lub
Kod: | Sub WymiarKartkiAuto()
Dim s As Shape
Dim sr As New ShapeRange
ActiveDocument.Unit = cdrMillimeter
Call sr.AddRange(ActivePage.Shapes.All)
Set s = sr.Group
Call s.AlignToPageCenter(cdrAlignHCenter + cdrAlignVCenter, cdrTextAlignBoundingBox)
Call ActivePage.SetSize(Ceiling(s.SizeWidth), Ceiling(s.SizeHeight))
s.Ungroup
End Sub |
|
|
|
|
|
michal.s
Praktyk
Wersja CorelDRAW: x4
Pomógł: 1 raz Dołączył: 01 Lut 2012 Posty: 66 Skąd: Poznań
|
Wysłany: 20 Lipiec 2012, 10:31
|
|
|
Co mogę robić nie tak
|
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 20 Lipiec 2012, 11:35
|
|
|
michal.s napisał/a: | Co mogę robić nie tak |
Ech.... czytanie ze zrozumieniem....
maroQ napisał/a: | Po dodaniu w kodzie wymienionej wyżej funkcji |
Czyli jak nie dopiszesz:
Kod: | Public Function Ceiling(ByVal x As Double) As Double
Ceiling = Int(x) + IIf(x - Int(x) > 0, 1, 0)
End Function |
to nie zadziała...
Innymi słowy musisz to co masz zastąpić tym:
Kod: | Public Function Ceiling(ByVal x As Double) As Double
Ceiling = Int(x) + IIf(x - Int(x) > 0, 1, 0)
End Function
Sub WymiarKartkiAuto()
Dim s As Shape
Dim sr As New ShapeRange
ActiveDocument.Unit = cdrMillimeter
Call sr.AddRange(ActivePage.Shapes.All)
Set s = sr.Group
Call s.AlignToPageCenter(cdrAlignHCenter + cdrAlignVCenter, cdrTextAlignBoundingBox)
Call ActivePage.SetSize(Ceiling(s.SizeWidth), Ceiling(s.SizeHeight))
s.Ungroup
End Sub |
Jak już pisałem w VBA nie ma funkcji sufit tj. Ceiling, więc specjalnie ją po to napisałem. No raczej nie pisałem tego tylko po to by zapełnić treścią posta (chociaż niektóre fora mierzą ile tekstu średnio się pisze).
Jak nie wstawisz Ceiling to dostaniesz komunikat: "Sub or Function not defined" czyli brak definicji funkcji sufit powoduje, że kompilator rozkłada ręce i mówi "pi... nie robię" (zresztą liczby pi też nie ma w VBA i trzeba z tym kombinować...) .
Klasa Math z VBA jest bardzo ograniczona w stosunku do VB6 nie mówiąc już o VB.NET czy VSTA (też VB.NET, działa od Corela X5, ale ja tego nie używam narazie skoro samo VB.NET też działa). |
|
|
|
|
michal.s
Praktyk
Wersja CorelDRAW: x4
Pomógł: 1 raz Dołączył: 01 Lut 2012 Posty: 66 Skąd: Poznań
|
Wysłany: 24 Lipiec 2012, 14:34
|
|
|
maroQ napisał/a: | Ech.... czytanie ze zrozumieniem.... |
No właśnie zrozumienia to nie było, oj nie było
michal.s napisał/a: | A czy mógłbym poprosić o lekkie zmodyfikowanie kodu
A mianowicie, jeżeli rozmiar elementu jest 100/100 mm to dopasowanie strony jest dokładnie takie.
Ale jeżeli element ma wymiar 99,4/99,4 mm to wymiar strony zaokrąglony zostaje do 99/99 mm |
Czy jest możliwość dopasowania strony dokładnie do wybranego elementu tzn. jeżeli zaznaczony element ma rozmiar 99,35/99,35 to strona po dopasowaniu bedzia miała wymiar 99,35/99,35 mm |
|
|
|
|
|
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.15 sekundy. Zapytań do SQL: 13 |
|
|