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

Makra - Przenoszenie zaznaczonego węzła w miejsce kursora

zyzio - 24 Maj 2016, 21:59
Temat postu: Przenoszenie zaznaczonego węzła w miejsce kursora
Witam. Czy z punktu widzenia programistycznego trudno byłoby napisać coś takiego jak makro przenoszące zaznaczony węzeł w miejsce aktualnego położenia kursora?
Wiem, że są skrypty, które wklejają ze schowka element w miejscu kursora myszki...
Generalnie chodzi o to, aby podczas edycji krzywej uniknąć konieczności ciągłego celowania w każdy węzeł i przesuwania go z naciśniętym przyciskiem myszy co jest rzeczą, której najbardziej nie lubię w corelu. Uważam, że szybkie zakreślenie danego węzła i wskazanie kursowem miejsca gdzie makro ma go przesunąć byłoby sporym ułatwieniem i przyspieszeniem pracy w tym zakresie.
Z góry dzięki za info.

chezare - 25 Maj 2016, 14:02

Jedyna różnica jest taka, że raz przesuwasz kursor z wciśniętym przyciskiem myszy, a raz bez. Wyobraź sobie, że masz węzeł na węźle i zaznaczyłeś więcej niż jeden, a pozycja kursora jest tylko jedna, który węzeł ma być ustawiony?
W Corelu jest jeszcze parę innych narzędzi, które wymagają wciśnięcia przycisku myszy przy rysowaniu, np. elipsa, prostokąt. Też chcesz to przerabiać? Jak szybki jesteś, że ma to jakiekolwiek znaczenie? Ja też jestem leniwy i nic innego nie robię, tylko kombinuję jak zrobić i się nie narobić, ale bez przesady.
To się bez wątpienia da zrobić, tylko po co?

zyzio - 25 Maj 2016, 17:52

chezare w moim przypadku najbardziej chodzi mi o 2 aspekty:
1. Wyeliminować potrzebę dokładnego celowania kursorem w dany węzeł z zamiarem jego przesunięcia (tego nie lubię najbardziej)
2. Przenoszenie zaznaczonego węzła w miejsce kursowa jako alternatywa dla przesuwania z wciśniętym przyciskiem myszy co jest po prostu bardzo męczące z fizycznego punktu widzenia podczas wielogodzinnej pracy.

Przy zaznaczeniu kilku węzłów domyślam się, że zostałyby przeniesione w to samo miejsce ale to nie jest problem, trzeba po prostu mieć to na uwadze. Pozostałe narzędzia o których wspomniałeś czyli elipsa, prostokąt są w porządku.

Generalnie całą tą ideę zaczerpnąłem z blendera, w którym moim zdaniem edycja krzywych stoi na najwyższym z możliwych poziomów użyteczności, a praca z nimi to czysta przyjemność. Niestety jako soft 3d nie ma on domyślnego exportera krzywych Beziera poza zewnętrznym skryptem napisanym przez jednego z użytkowników, jednak nie jest już rozwijany a wymaga dopracowania.

tomek123 - 25 Maj 2016, 23:10

Kod:

Public Sub go_click()
On Error Resume Next
    Dim c As Curve, i%, x#, y#
    Set c = ActiveShape.Curve
    For i = 1 To c.Nodes.count
        If c.Nodes(i).Selected Then
            ActiveDocument.GetUserClick x, y, 0, -1, True, 309
            c.Nodes(i).SetPosition x, y
            Exit For
        End If
    Next i
End Sub

najlepiej przypisz sobie to makro do jakiegoś klawisza, ale nie wiem jak to się robi, powinno gdzieś pisać w Google

zyzio - 26 Maj 2016, 00:19

No po prostu super :) Tomku a dałoby radę zniwelować to dodatkowe kliknięcie, które wskazuje nowe miejsce dla węzła? Czyli mam zaznaczony węzeł, następnie wciskam skrót klawiszowy przypisany do makra i węzeł przemieszcza się od razu w miejsce kursora bez dodatkowego kliknięcia.
Dzięki

Cysorz - 26 Maj 2016, 00:24

Brawo za skrypt, nawet nie sądziłem, że coś takiego jest takie proste ;)
Ale tak się zastanawiam nad sensem takiego działania, bo zamiast operacji "zaznacz - przeciągnij - upuść" trzeba dodatkowo gdzieś tam na końcu jeszcze jakiegoś skrótu (lub wciśnięcia specjalnie stworzonej do tego ikonki?) użyć. I myszka w międzyczasie nie może nawet drgnąć, bo węzeł trafi nie tam gdzie trzeba... A przecież można włączyć przyciąganie do obiektu, prowadnic, siatki czy co tam jeszcze ktoś sobie życzy.
Broń Boże, żebym krytykował, ale jakoś w tym większego sensu nie widzę a w Corelu pracuję (praktycznie codziennie) już coś koło ćwierć wieku ;)
Zresztą może właśnie dlatego... :-/

chezare - 26 Maj 2016, 00:26

Bo w tym nie ma żadnego sensu.
Skrót? :-)
Będzie z tego więcej nieszczęść, niż pożytku, ale bawcie się dalej.

zyzio - 26 Maj 2016, 00:42

Panowie ja też w Corelu jestem już ładnych kilka lat codziennie i stuningowałem go jak tylko się dało w miarę moich możliwości a mianowicie wspomagam się podczas pracy programem do obsługi gestów myszy "StrokesPlus" umożliwiającym przypisanie do konkretnego gestu wiele pożytecznych rzeczy począwszy od skrótów klawiszowych a skończywszy na rozbudowanych makrach oraz "Autohotkey" dzięki któremu można praktycznie w nieograniczony sposób definiować własne kombinacje skrótów klawiszowych i wiele więcej
natomiast w kwestii sposobu przemieszczania w tym przypadku węzłów sam nie jestem sobie w stanie poradzić - zazdroszczę Wam wiedzy z zakresu programowania i wierzcie mi, że gdybyście popracowali jakiś czas na krzywych w blenderze (co gorąco polecam) to przyznalibyście, że rozwijanie takiego rozwiązania bezpośrednio w corelu ma sens.

chezare - 26 Maj 2016, 01:32

O ile mogłem sobie wyobrazić zaznaczenie węzła, przesunięcie kursora i kliknięcie, to zastąpienia tegoż kliknięcia skrótem klawiaturowym wyobrazić sobie nie mogę.
Naturalnym narzędziem w programie graficznym nie jest mysz, tylko tablet i piórko.
Musicie wymyślić skrót, który da się obsłużyć jedną ręką, bo odkładanie piórka tak żeby nie ruszył się kursor będzie niewygodne. :-) O tym, że zajmie to dodatkowo czas nie wspomnę.
Rozumiem przyzwyczajenia, ale wydaje mi się, że ktoś kto używa różnych programów, sam tak mam, które w różny sposób są obsługiwane, nie ma problemu z tym, że w jednym jest tak, a w drugim inaczej?

Cysorz - 26 Maj 2016, 02:15

keyzetman - nie odbieraj tego jako krytyki, bo ani ja ani chezare jesteśmy od tego daleko (chezare - mam nadzieję, że nie obrazisz się, że wypowiadam się przy okazji w Twoim imieniu?). Ja jako stary pryk po prostu nie rozumiem, po co "obchodzić" jakąś funkcję, skoro jej działanie jest proste i zrozumiałe a wszelkie kombinowanie tylko gmatwa sprawę...
chezare - 26 Maj 2016, 06:32

O co miałbym się obrażać kiedy w zasadzie to samo myślę. :-)
Rozumiem, że przyzwyczajenie może przez chwilę przeszkadzać, ale nie wierzę, że może to trwać latami. Trudno mi też uwierzyć, że od przytrzymania przycisku myszy komuś może się zmęczyć palec. Wątpię żeby taka modyfikacja przyspieszyła choćby odrobinę pracę, na pewno nie przyśpieszy jej procedura, którą trzeba "ręcznie" wywołać. Mam nadzieję, że Tomek się nie obrazi.
Nie znam się na tym i być może jakąś głupotę napiszę, ale wydaje mi się, że z obiektem złożonym z krzywych nie jest powiązane żadne zdarzenie związane z myszą, a to jest warunek żeby taka procedura uruchamiała się automatycznie w momencie kliknięcia czy przemieszczenia gryzonia.
To nie jest moim zdaniem proste zadanie.

zyzio - 26 Maj 2016, 09:20

chezare napisał/a:
...Trudno mi też uwierzyć, że od przytrzymania przycisku myszy komuś może się zmęczyć palec....


chezare po kilku dniach pod rząd przy wektoryzacji starych map i planów geodezyjnych to nie jest już kwestia wiary lecz fakt :) na tyle odczuwalny, że dobrałem się do mikrostyku w myszce, aby zmniejszyć jego "twardość" podczas klikania.
To właśnie z punktu widzenia pracy przy mapach poprosiłem o pomoc z tym skryptem.
Kolejna kwestią, jest to, że każdy z nas na pewno ma już wypracowany własny styl pracy, który jego zdaniem jest najlepszy i także w moim przypadku tak jest no ale nawet jeśli coś jest dobre nie znaczy, że nie może być jeszcze lepsze.
Dzięki skryptowi, który wstawił tomek123 mogę teraz zadeklarować w programiku "Autohotkey" pod jednym skrótem klawiszowym 3 rzeczy po kolei:

1. wciśnięcie klawisza "+" na klawiaturze numerycznej co jak wiadomo spowoduje dodanie nowego węzła w kolejności za lub przed aktualnie zaznaczonym, zależnie od kierunku krzywej
2. uruchomienie wspomnianego skryptu (można ustawić kilkadziesiąt milisekund opóźnienia aby nie dochodziło do nieprzewidzianych zdarzeń)
3. kliknięcie lewego przycisku myszki

Co to daje? W moim przypadku bardzo wiele właśnie podczas pracy nad mapami, ponieważ zaczynając rysować dany element najpierw dodaję na szybko "z daleka" podstawowe węzły potrzebne aby złapać zarys całego obiektu a dopiero później już na dużym powiększeniu widoku dodaję bardzo precyzyjnie wszystkie detale.

tomek123 - 26 Maj 2016, 11:11

Kod:
Private Declare Function GetCursorPos Lib "user32" (ByRef pos As lpPoint) As Boolean
Private Type lpPoint: x As Long: y As Long: End Type
Public Sub go_cursor()
    On Error Resume Next
    Dim c As Curve, p As lpPoint, x#, y#, i%
    ActiveDocument.Unit = cdrMillimeter
    Set c = ActiveShape.Curve
    For i = 1 To c.Nodes.count
        If c.Nodes(i).Selected Then
            GetCursorPos p
            ActiveDocument.ActiveWindow.ScreenToDocument p.x, p.y, x, y
            c.Nodes(i).SetPosition x, y
            Exit For
        End If
    Next i
End Sub

dwie pierwsze linijki muszą być umieszczone na górze modułu nad wszystkimi procedurami...
Zaznacza się węzeł i po naciśnięciu skrótu do procedury 'go_cursor' węzeł się przemieszcza
Żeby zrobić skrót to w managerze makr prawy klik

tomek123 - 26 Maj 2016, 11:26

Kod:
Public Sub go_cursor_mm()
    On Error Resume Next
    Dim c As Curve, p As lpPoint, x#, y#, i%, pos_x&, pos_y&
    ActiveDocument.Unit = cdrMillimeter
    Set c = ActiveShape.Curve
    For i = 1 To c.Nodes.count
        If c.Nodes(i).Selected Then
            GetCursorPos p
            ActiveDocument.ActiveWindow.ScreenToDocument p.x, p.y, x, y
            pos_x = x
            pos_y = y
            c.Nodes(i).SetPosition pos_x, pos_y
            Exit For
        End If
    Next i
End Sub

jak potrzebujesz szybko tworzyć proste linie i kąty proste z tworzonych węzłów to druga procedura, która przyciąga do pełnych współrzędnych w mm

ale jak chcesz przyciągać do cm lub innej jednostki miary to wystarczy zmienić:
ActiveDocument.Unit = cdrMillimeter na np. ActiveDocument.Unit = cdrCentimeter

zyzio - 26 Maj 2016, 11:42

Fantastycznie dokładnie o coś takiego mi chodziło :) tomek123 jesteś wielki, bardzo dziękuję.
tomek123 - 26 Maj 2016, 11:57

nie ma za co ;) ja też to wykorzystam przy pracy, bo nawet mi się to spodobało i już sobie dodałem do prywatnego zbioru, ale pomysł był jednoznacznie twój, najważniejszy jest pomysł
zyzio - 26 Maj 2016, 12:24

Pomysł to jedno ale wiedza jak go wykonać to drugie.
Tomku widzę, ze masz doświadczenie w programowaniu a taka wiedza jest cenna więc jeśli byłbyś zainteresowany jeszcze kilkoma pomysłami to mógłbym za ich realizację zapłacić:)


Powered by phpBB modified by Przemo © 2003 phpBB Group