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ł: 574 razy Dołączył: 25 Lis 2009 Posty: 7680 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: 114 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: 40 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: 40 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. |
|
|
|
|
|