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

Makra - Zmiana pieszego węzła w obiekcie.

plpiero - 18 Luty 2015, 20:13
Temat postu: Zmiana pieszego węzła w obiekcie.
Witam,
Po Przekształceniu Obiektu (Cyfra,Litera) W Krzywe, Pierwszy Węzeł Nie Zawsze Pojawia Się
w Tym Miejscu Co Bym Chciał. Czy Jest Możliwość Przeniesienia Go W Pozycje Innego Węzła?
Poprostu By To Inny Węzeł Był Tym Pierwszym.
Pozdrawiam.

Cysorz - 18 Luty 2015, 20:30

To ja może przetłumaczę co autor miał na myśli:
Cytat:
Witam, po przekształceniu obiektu (cyfra, litera) w krzywe, pierwszy węzeł nie zawsze pojawia się w tym miejscu co bym chciał. Czy jest możliwość przeniesienia go w pozycje innego węzła? Po prostu by to inny węzeł był tym pierwszym.
Pozdrawiam.

ok

chezare - 18 Luty 2015, 20:46

Czy Jest Możliwość Przeniesienia Węzła Na Pozycję Innego Węzła? Jest, Tylko Zmieni To Obraz Rysunku. Czy Jest Możliwe Żeby Zmienić Początek (Koniec) Krzywej? Jest, Tylko Po Co?
Tłumacz Malutki.

restauro - 18 Luty 2015, 20:46

plpiero napisał/a:
By To Inny Węzeł Był Tym Pierwszym

Oczywiście że można ,tylko jaki to ma sens ?

chezare - 18 Luty 2015, 20:47

Bo kolega wykombinował, że bardziej by mu się podobało jakby laser, ploter zaczynał od innego miejsca :-)
restauro - 18 Luty 2015, 20:51

Na to nie wpadłem. :oops: Genialne posunięcie .
plpiero - 18 Luty 2015, 20:54

Informacje O Pozycji Węzłów Eksportuje Do Plotera. W Tym że Ploterze
Pozycja 0,0 Znajduję Się Przeważnie W Lewym Górnym Rogu Obiektu
A Obróbka Rozpoczyna Się Od Pierwszego Węzła, Skąd Biorą Się Nie
Potrzebne Przebiegi.
Sorry, Za Duże Litery, Mój Telefon Tak Ma. ;-)

plpiero - 18 Luty 2015, 20:56

chezare napisał/a:
Bo kolega wykombinował, że bardziej by mu się podobało jakby laser, ploter zaczynał od innego miejsca :-)


Dokładnie.

chezare - 19 Luty 2015, 02:00

To w jakiej kolejności są wycinane elementy może mieć i często ma znaczenie, to skąd maszyna zaczyna nie ma żadnego znaczenia i nic tu nie zyskasz na czasie, ani nie zaoszczędzisz :-)
plpiero - 19 Luty 2015, 17:04

Witam, moje ustrojstwo to maszyna, która z klasycznym cnc nie mająca za wiele wspólnego.
Komunikacja z komputerem i program sterujący to tylko moja wariacja na temat.:-)
A specyfika jej pracy wyklucza właśnie prace w sposób jak na poniższym obrazku.
Linie przejazdu nie mogą się krzyżować, jak i nie mogą "wchodzić" w obrys kształtu.
Może ma ktoś pomysł, jak z automatyzować przekładkę węzłów.

chezare - 19 Luty 2015, 23:05

To że to jakaś specyficzna maszyna, że tego czy tamtego nie wolno jakoś słabo mnie przekonuje.
Oświeć mnie jak wytniesz coś takiego, trzymając się swoich założeń?

Artur Miernik - 21 Luty 2015, 12:52

Z drugiej strony, zmiana węzła początkowego, teoretycznie, może przydać się w programowaniu makr.
chezare - 21 Luty 2015, 13:31

Artur, zapytaj Restauro, on wie jak to zrobić :-)
Ja bym obrócił znak o 180° :-)

restauro - 21 Luty 2015, 16:10

chezare napisał/a:
zapytaj Restauro, on wie jak to zrobić

Ja bym obrócił do góry nogami. dances

restauro - 21 Luty 2015, 18:28

Początki zazwyczaj są trudne,nie należy się więc zniechęcać .
http://www.youtube.com/watch?v=j0tAOIQiz-8

i pracować nad sobą .
http://www.youtube.com/watch?v=QATICdf7b-0

chezare - 21 Luty 2015, 20:44

Jak miałem 13 lat to też tak umiałem, ale ja przestałem trenować, a Jimmy trenuje do tej pory :-) Wie Page co dobre. Ja najbardziej lubię sonatę w b-mol, a dokładnie fragment z marszem :-)
https://www.youtube.com/w...968E9ED&index=3
Chopin przez całe swoje życie napisał 18 godz. muzyki, ale za to jakiej :-)
Żeby nie kończyć smutno, choć to chyba jeden z najweselszych marszów żałobnych, wracam do Jimmiego i jego drużyny.
https://www.youtube.com/watch?v=1HHMA1Dpo5M
Ten jeden z najbardziej znanych gitarowych riffów nie jest wynalazkiem Page'a tylko innego wirtuoza tego instrumentu, Hendrixa.
Tak w ogóle, to na gitarze gra się tak
https://www.youtube.com/watch?v=2oyhlad64-s

Żeby mnie Roland nie wywalił :-)

PACO DE LUCIA

Cysorz - 22 Luty 2015, 00:23

A tak wracając do tematu to jak w Corelu można zobaczyć, który węzeł jest PIERWSZY?
bidon184 - 22 Luty 2015, 00:34

a taka stzrałka pokazuje,i wracajac do tematu obrot do gory nogami niezawsze sie sprawdzi ,bo co gdy ltos zaczal rysowac np od srodka :-) , trza w tedy przeniesc ten wezel ,moim zadanie metoda jaka opisalem wyzej jest chyba najprostrza tylko czy mozna z tego zrobić makro ,hym,wątpie
chezare - 22 Luty 2015, 01:00

Po chwili zastanowienia to wydaje mi się, że ta dziwna maszyna jest wirtualna.
Mogę się jednak mylić, dlatego żebyście dalej nie mordowali się jak zmienić początek, albo jak kto woli koniec, zakładam, że figura jest zamknięta, to powiem wam jak to zrobić :-)
Sposób jest banalnie prosty, należy znaleźć węzeł do którego jest najbliżej z pozycji startowej i na tym węźle rozłączyć krzywą. Oczywiście można później zamknąć taką krzywą, tu już wiedza gdzie jest rozłączona nie jest potrzebna, bo rozłączona jest tylko w jednym miejscu. Na wycinanie nie ma to żadnego wpływu, więc po rozłączeniu można już nic nie robić.
Jesteśmy w makrach, to trzeba sobie zadać pytanie, czy w makrze da się określić pozycje poszczególnych węzłów? Moim zdaniem, choć się na tym nie znam, da się to zrobić bez problemu. Następne pytanie jest takie, co zrobić jak tych figur jest więcej, albo obrazek składa się z dwóch, lub tak jak ósemka, trzech figur?

Cysorz - 22 Luty 2015, 01:13

Odpowiedzi tyle, że hej a ja dalej nie wiem...
To może jeszcze raz, bo mi trzeba wytłumaczyć jak prostemu chłopu:
Krzywa, węzły niezaznaczone:


Krzywa, węzły zaznaczone:


No to gdzie mam szukać tego PIERWSZEGO węzła?

bidon184 - 22 Luty 2015, 01:21

a tutaj np

chezare - 22 Luty 2015, 01:31

Tam gdzie program pokazuje :-)

Cysorz - 22 Luty 2015, 01:40

OK, też dam screen w większej rozdzielczości. Krzywa, węzły niezaznaczone:


Krzywa, węzły zaznaczone:


I co dalej?

chezare - 22 Luty 2015, 01:42

Malutki, walisz jak Gołota, ja skopiowałem Twój obrazek :-)

Skonstruowałem taki wynalazek który powinien Ci pomóc znaleźć początek :-)
Musi być zaznaczona pojedyncza figura i musi być w krzywych inaczej procedura się wykolei, albo zgłupieje :-)

Kod:
Sub Pozycja_wezla()
Dim x As Double
Dim y As Double
Dim i As Double
Dim xx, yy As Double
Dim s As String
Dim krz As Shape
ActiveDocument.Unit = cdrMillimeter
s = "Współrzędne węzłów x/y[mm]:" + Chr(13)
ActiveShape.Curve.Segments.Item(1).StartNode.GetPosition x, y
xx = x
yy = y
s = s + Chr(13) + Str(x) + " / " + Str(y)
    For i = 1 To ActiveShape.Curve.Segments.Count
    ActiveShape.Curve.Segments.Item(i).EndNode.GetPosition x, y
    s = s + Chr(13) + Str(x) + " / " + Str(y)
    Next i
Set krz = ActiveLayer.CreateEllipse2(x, y, 5, 5, 90#, 90#, False)
krz.Outline.SetProperties 1, OutlineStyles(0), CreateCMYKColor(0, 100, 100, 0), , , , , , , 0#, 100
MsgBox s
End Sub


Gdyby komuś przyszedł do głowy pomysł uruchomienia tej procedury, to powinien zapisać wszystkie otwarte dokumenty, założyć kask, postawić obok komputra działającą gaśnicę i sprawdzić czy ma OC, AC i NW.

Teraz tylko trzeba te współrzędne zapisać w tablicy, posortować, znaleźć węzeł który jest najbliżej lewego górnego rogu (miejsca startu tej wirtualnej maszyny) :-) , rozłączyć na tym węźle figurę, ewentualnie zamknąć, choć to nie jest konieczne i gotowe.
Szybciej będzie znaleźć ten węzeł oczyma, albo jak ktoś ma 30" monitor, oczami :-)
Zauważyłem interesującą rzecz. Jak rysujemy jakąś figurę i użyjemy narzędzia do zamykania, to początek jest w miejscu z którego zaczęło się zamykanie, a nie tam skąd zaczęliśmy rysować, zamyka się do ostatniego postawionego węzła, a nie od ostatniego do pierwszego.

Kto mówił, że początek jest tam skąd zaczynamy rysować? :-)

Tyle w temacie początku krzywej tworzącej jakiś zamknięty kształt.
Temat niestety tego nie dotyczy, przyznam się bez bicia, że pierwszy raz coś takiego widzę :-)

Artur Miernik - 22 Luty 2015, 05:07

Tum TuRumTum, Rum Tu TumTum Poą?
chezare - 22 Luty 2015, 07:30

Tutaj magik który równie sprawnie posługuje się gitarami akustycznymi i elektrycznymi.
https://www.youtube.com/watch?v=Kt7aE_Fzhd8
https://www.youtube.com/watch?v=2csfvIEO5kU
Szwed wymyślił wyżłobienie progów, Fender robi gitary sygnowane jego nazwiskiem, gra kostkami podpisanymi jego nazwiskiem i używa strun które też nazywają się Malmsteen.
To bez wątpienia jeden z najlepszych gitarzystów rockowych.

restauro - 22 Luty 2015, 11:25

"Zmieniony przez chezare Dzisiaj 6:41, w całości zmieniany 21 razy."
Żeby to jeszcze jakoś ładnie zagmatwać , pomyślałem słuchając Paco de Lucia Burghausen 2004 , że pomocne byłoby dodatkowo zastosowanie teorii prawdopodobieństwa .

Martin Nez - 22 Luty 2015, 15:30

Witam,
ostatnio pisałem pewne makro i przydatnym narzędziem w nim była właśnie możliwość ręcznego ustawienia "pierwszego" węzła.
Napisałem coś takiego:
Kod:
Sub ustawStart()
    If ActiveSelection.Shapes.Count = 0 Then
        MsgBox ("Zaznacz węzeł w obiekcie.")
        Exit Sub
    End If
   
    ActiveDocument.Unit = cdrMillimeter
    Dim s As Shape
    Dim sp As SubPath
    Dim test As Boolean
    test = False
   
    Set s = ActiveShape
   
    For Each sp In s.Curve.SubPaths
        For i = 1 To sp.Nodes.Count
            If sp.Nodes(i).Selected = True Then
                sp.Nodes(i).BreakApart
                sp.EndNode.JoinWith sp.StartNode
                test = True
            Else
                If i = sp.Nodes.Count And test = False Then
                    MsgBox ("Zaznacz węzeł.")
                End If
            End If
        Next i
    Next sp
End Sub


Warunkiem użycia jest zaznaczenie węzła, który powinien być pierwszy przy pomocy narzędzia Kształt.

Pozdr,
MN

chezare - 22 Luty 2015, 17:50

Zaznaczenie węzła i kliknięcie ikony "rozłącz" to jeden ruch, jak wyciągniesz makro na wierzch, to zmieni się tylko to, że ikona będzie w innym miejscu :-)
Poza tym, choć tu mogę się mylić bo się na tym nie znam, nie za bardzo ma sens wędrówka po wszystkich segmentach i węzłach, jak jeden jest zaznaczony. Zaznaczony węzeł da się w makrze zidentyfikować bez tych pętli?
Jak przyjdzie Szaman, to znowu powie że przypisujesz wartość zmiennej która w momencie deklaracji taką wartość otrzymuje. Test zawsze po uruchomieniu procedury będzie miał wartość false :-)
Oprócz tego, ta procedura powinna kończyć działanie w momencie znalezienia zaznaczonego węzła, a chyba tak nie jest?

maroQ - 25 Luty 2015, 23:43

Martin Nez napisał/a:

Kod:
(...)
        For i = 1 To sp.Nodes.Count
(...)
Wypadało by zadeklarować zmienną "i" jako liczbę całkowitą (integer) bo inaczej używasz zmiennej typu "variant".
Martin Nez napisał/a:

Kod:
(...)
            Else
                If i = sp.Nodes.Count And test = False Then
(...)
Heh... myślenie z PHP? Miałem tak jak zaczynałem z VBA. Polecam jednak "ElseIf".

No to tyle drogą czepiania się by wszyscy byli zadowoleni, że szaman się znowu czegoś czepia ( dances ).

Ja bym to napisał tak:
Kod:
Sub ustawStart()
    If ActiveSelection.Shapes.Count = 0 Then
        MsgBox "Zaznacz węzeł w obiekcie.", vbExclamation, "(o.0)"
        Exit Sub
    End If
   
    On Error GoTo fin
   
    Optimization = True
   
    ActiveDocument.Unit = cdrMillimeter
    Dim c As Curve
    Dim i As Integer

    Set c = ActiveShape.Curve

    For i = 1 To c.Nodes.Count
        If c.Nodes(i).Selected Then
            c.Nodes(i).BreakApart
            c.Closed = True
            GoTo fin
        End If
    Next i
   
    MsgBox "Zaznacz węzeł!!", vbExclamation, "(0.0)"
fin:
    Optimization = False
    Refresh
End Sub

Działa również jeśli krzywa posiada wiele ścieżek (podkrzywych :D ).

Zmiennych typu boolean nie trzeba sprawdzać:
Kod:
Dim kali As Boolean
kali = true
if kali then
 (...)
end if
lub
Kod:
Dim kali As Boolean
kali = false
if Not kali then
 (...)
end if

Zapis "kali = true" jest oczywiście bardziej oczywisty i czytelny. Poza programistami C bo ci w tym momencie dostają zawału (jeśli nie znają VBA bo = to operator przypisania w C).
Swoją drogą w przypadku wartości logicznych ustawienie zmiennej po deklaracji bywa sensowne bo zwiększa czytelność kodu. W VB.NET bardziej jednak przydają się w takim przypadku stałe. Raz ustawiona stała nie zmienia stanu w trakcie działania programu dzięki czemu można np. odblokowywać pewne funkcje dla potrzeb debugowania w trakcie pisania programu i nie martwić się później o usuwanie nadmiarowego kodu.

chezare - 26 Luty 2015, 03:03

Nie żebym się czepiał i do niczego mi taka procedura niepotrzebna, ale sytuacja jest taka, że mamy zaznaczony konkretny, pojedynczy węzeł. Nie ma w VBA metody żeby bez sprawdzania po kolei wszystkich wykonać operację na tym jednym zaznaczonym?
maroQ - 4 Marzec 2015, 22:11

chezare napisał/a:
Nie ma w VBA metody żeby bez sprawdzania po kolei wszystkich wykonać operację na tym jednym zaznaczonym

Nie chodzi o samo VBA, ale o to jakie metody Corel udostępnia. Niestety nie ma możliwości operowania na obiektach zaznaczonych w inny sposób. Można znaleźć krzywą, ale nie segment czy węzeł. Do tego celu trzeba przejrzeć wszystkie węzły jeden po drugim i zakończyć pętlę w momencie znalezienia konkretnego. Podobnie wygląda sytuacja z zaznaczaniem aktywnego narzędzia (co nie bardzo działa) i wieloma innymi funkcjonalnościami dostępnymi z VBA. Niestety jeśli wiesz jak coś zrobić ręcznie to nie ma gwarancji, że zrobisz to z makra. Da się rejestrować i odtwarzać klawiaturę i mysz, ale to wymaga zarejestrowania takich operacji i później ich wywołaniu. Funkcjonalność fajna, ale zupełnie nie uniwersalna bo dla nowego komputera z inną rozdzielczością trzeba by wszystko ustawiać ponownie, nie mówiąc o zmianie wersji Corela czy pozycji danego paska. Napisałem taki program pod wpływem ludka który kiedyś mocno mącił w tej części forum twierdząc, że VBA jest do niczego i jego program do rejestracji myszy i klawiatury robi to lepiej i szybciej. Napisanie czegoś takiego nie jest aż tak wielkim problemem. Zresztą są gotowe fragmenty kodu które można w tym celu wykorzystać, ale brak przenośności tego rozwiązania sprawia, że narazie trzeba pozostać przy tym co oferuje VBA.


Powered by phpBB modified by Przemo © 2003 phpBB Group