[VBA]Zwcad2023 - Object.Mirror


Rekomendowane odpowiedzi

Pracuję już długo na swoim makrze. Wszystko działało na Zwcad 2020 do czasu przejścia na Zwcad 2023 SP2.

Doszedłem do tego, że object.Mirror nie działa prawidłowo na blokach. Niby odbija lustrzanie blok ale nie jego atrybuty. Wszystko nagrałem na poniższym filmiku.

Macie jakieś porady jak to naprawić?

'******** bigle *********
'------------------------
  If typ = "bigle" Then BlockAttributes(0).TextString = ilosc & "%%c" & srednica & "-U-co" & d
    If typ = "bigle" And PIERWSZY(0) < DRUGI(0) And blizszyKierunek = "poziom" Then
        pt1(0) = TRZECI(0)
        pt1(1) = TRZECI(1)
        pt2(0) = pt1(0)
        pt2(1) = CZWARTY(1)
        MsgBox "pt1(" & pt1(0) & "," & pt1(1) & ")" & vbNewLine & "pt2(" & pt2(0) & "," & pt1(2) & ")"

        Set objDrawingObject = BlockRef.Mirror(pt1, pt2)
        MsgBox "Set objDrawingObject = BlockRef.Mirror(pt1, pt2)"
        objDrawingObject.Update
        MsgBox "objDrawingObject.Update"
        BlockRef.Delete
    End If

http://cloud.movavi.com/show/ae358aa9-062f-42d0-a41c-308042aa56db

Odnośnik do komentarza
Udostępnij na innych stronach

Na filmiku - blok górny został przygotowany tak jak ma być finalnie. Niestety nie mam już dostępu do wersji 2020 bo miałem jakiś błąd prze który musiałem przeinstalować i wybrałem aktualizację (przy okazji) do wersji 2023. 

Na słowo - musicie mi uwierzyć, że blok był prawidłowo odbijany tak, jakby go zrobić lustrem w opcjach cadowskich.

Odnośnik do komentarza
Udostępnij na innych stronach

Wierzę na słowo. Ale biorę też poprawkę na to że już tyle razy inaczej rozumiałem słowo "prawidłowo" że przestałem wierzyć własnym ocenom i wolę porównywać twarde dane.

7 minut temu, pop3k napisał:

blok górny został przygotowany tak jak ma być finalnie

Zdecydowanie to ważna informacja

53 minuty temu, pop3k napisał:

Niby odbija lustrzanie blok ale nie jego atrybuty

Za to ta informacja nas zmyliła. Zrozumieliśmy że właśnie atrybuty - literki chce Pan odbijać lustrzanie, stąd pomysł o

MIRRTEXT

Przygotowałem przykład z własnym blokiem i rzeczywiście metoda

object.Mirror 

uruchomiona w VBA działa inaczej niż polecenie ZWCADa.
Efekt do zobaczenia na obrazku.

Mirror.png.e9e39671c823e74a6f4752ed038c9c63.png

Czyli różnica jest w tym, że tekst powinien być przesunięty jeszcze o jego szerokość w tym przypadku w lewo ( odbijałem to po prawej na lewo).

Dobrze to rozumiem?

Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie lepiej będzie przedstawić to na obrazku. Skróciłem blok i zwymiarowałem jego punkty charakterystyczne. To, jak było w ZWCAD 2020 i jak jest w 2023. Widać, że w 2023 (drugi atrybut tekstowy) funkcja mirror dokładnie odbija wskazane punkty a nie tak jak funkcja lustro i w 2020 czyli jakby dopasowuje do wielkości tekstu i tam wstawia punkt charakterystyczny

mirror.png

Odnośnik do komentarza
Udostępnij na innych stronach

23 minuty temu, pop3k napisał:

A mi przychodzi. Tylko nie wiem jak.

Czy można wywołać funkcję lustra z poziomu vba? tak, żeby podczas wykonywania linii sam sobie napisał wywołanie funkcji, podał 2 punkty charakterystyczne dla lustra i kontynuował kod VBA?

Można. W skrócie składnia byłaby taka. Myślę że zamiana współrzędnych z liczbowych na tekst to już prosta sprawa.

Dim entity As String
entity = "(handent " & Chr(34) & ref.handle & Chr(34) & ")"
ThisDrawing.SendCommand "_MIRROR" & vbCr & entity & vbCr & vbCr & "420,340 420,360" & vbCr

Nie lubię tej metody dlatego, że powstaje nowy obiekt. Jeśli chcemy później jeszcze coś z tym zrobić, to nie możemy posłużyć się tym, który mieliśmy wcześniej np przechowany w zmiennej przed uruchomieniem funkcji. Inna kwestia to że polecenia jako SendCommand są wywoływane asynchronicznie więc kod VBA będzie się wykonywał dalej nie czekając na zakończenie działania polecenia.

Odnośnik do komentarza
Udostępnij na innych stronach

Działa. Czyli jest rozwiązanie tymczasowe.

        entity = "(handent " & Chr(34) & BlockRef.Handle & Chr(34) & ")"
        punkty = pt1(0) & "," & pt1(1) & " " & pt2(0) & "," & pt2(1)
        punkt1 = Replace(pt1(0), ",", ".")
        punkt2 = Replace(pt1(1), ",", ".")
        punkt3 = Replace(pt2(0), ",", ".")
        punkt4 = Replace(pt2(1), ",", ".")
        punkt = punkt1 & "," & punkt2 & " " & punkt3 & "," & punkt4
        ThisDrawing.SendCommand "_MIRROR" & vbCr & entity & vbCr & vbCr & punkt & vbCr & "Tak" & vbCr
        
        ThisDrawing.SendCommand "STR_ZPP_v2"
        frm_ZP_v2.hide

Zapisuję kod na forum dla tych co szukają gotowego rozwiązania. Dziekuję!

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie