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

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload

Poprzedni temat «» Następny temat
Zmiana pieszego węzła w obiekcie.
Autor Wiadomość
chezare 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 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 



Wersja CorelDRAW: CorelDraw X4 ,X7
Pomógł: 573 razy
Dołączył: 25 Lis 2009
Posty: 7667
Skąd: Gdynia
Wysłany: 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 
Doradca
Grafik?


Wersja CorelDRAW: 2019
Pomógł: 14 razy
Dołączył: 29 Sty 2011
Posty: 113
Skąd: Czmoń
Wysłany: 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 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 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 
Doradca


Pomógł: 16 razy
Wiek: 39
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
  Wysłany: 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 



Pomógł: 402 razy
Dołączył: 24 Gru 2010
Posty: 4551
Skąd: Grodzisk Mazowiecki
Wysłany: 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 
Doradca


Pomógł: 16 razy
Wiek: 39
Dołączył: 08 Lut 2011
Posty: 117
Skąd: Kalisz
Wysłany: 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.
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
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.1 sekundy. Zapytań do SQL: 13