Przycisk wywołujący funkcje w C#


Rekomendowane odpowiedzi

Witam,

Potrzebuję wsparcia.

Oprogramowując przycisk wywołujący dowolną komendę  w C# pod AutoCAD robię to tak:

private void button_zigazag_Click(object sender, RoutedEventArgs e)
        {

            zza.Document acDoc = zza.Application.DocumentManager.MdiActiveDocument;

            Autodesk.AutoCAD.Internal.PreviousInput.CommandLineMonitorServices comLineMonServ =
            Autodesk.AutoCAD.Internal.PreviousInput.CommandLineMonitorServices.Instance();
            Autodesk.AutoCAD.Internal.PreviousInput.CommandLineMonitor comMon = comLineMonServ.GetCommandLineMonitor(acDoc);

            if (comMon.CurrentCommandName.Length != 0)
            {
                acDoc.SendStringToExecute("\x03\x03", false, true, false);
            }
            acDoc.SendStringToExecute("WG_ZIGZAG ", true, false, true);
            Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
        }

W przypadku wywołania okna i komendy oraz gdy program jest  w trakcie zapytania przykładowo " Wskaż punkt ..." gdy kliknę tak oprogramowany przycisk innej komendy automatycznie jest anulowana komenda w tle.

Niestety nie wiem jak coś takiego uzyskać w ZwCAD. Aktualnie mam dopracowany taki kod dla ZwCAD 2017:

  private void button_zigazag_Click(object sender, RoutedEventArgs e)
        {
            zza.Document acDoc = zza.Application.DocumentManager.MdiActiveDocument;
            acDoc.SendStringToExecute("\x03\x03", false, true, false);
            acDoc.SendStringToExecute("WG_ZIGZAG ", true, false, true);
            ZwSoft.ZwCAD.Internal.Utils.SetFocusToDwgView();
        }

niestety ten kod nie zadziała tak jak ten powyżej. W ZwCAD net nie ma:

ZwSoft.ZwCAD..Internal.PreviousInput.CommandLineMonitorServices comLineMonServ =
            ZwSoft.ZwCAD..Internal.PreviousInput.CommandLineMonitorServices.Instance();
            ZwSoft.ZwCAD..Internal.PreviousInput.CommandLineMonitor comMon = comLineMonServ.GetCommandLineMonitor(acDoc);

Na pewno jest jakieś lepsze rozwiązanie. Tym bardziej, że standardowe przyciski ZwCAD przerywają działające w tle funkcje.

Jeśli to możliwe proszę o pomoc.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Zaraz chwila, bo chyba czegoś nie rozumiem.
W AutoCAD wszystko jest OK? czy tutaj też anuluje polecenie?

Chyba właśnie anulowaniu aktywnego polecenia ma służyć:

 acDoc.SendStringToExecute("\x03\x03", false, true, false);

czy nie?

Dlaczego

ZwSoft.ZwCAD..Internal.

pomiędzy ZwCAD a Internal są dwie kropki?

17 godzin temu, Parikon napisał:

Na pewno jest jakieś lepsze rozwiązanie.

O rozwiązanie jakiego problemu chodzi?

Odnośnik do komentarza
Udostępnij na innych stronach

Już wyjaśniam.

Dwie kropki to "się zrobiły" niechcący. Proszę na to nie zwracać uwagi.

Film pierwszy.

Wybrałem jakąś komendę. Wyskakuje okno. W oknie, które wyskoczyło wciskam przycisk Rysuj. Program pyta "Wskaż ....". W tym momencie stwierdzam, że chcę użyć innej komendy i klikam inny przycisk. Anulowana jest stara komenda i wyskakuje okno nowo wybranego programu.

Film drugi

W ZwCAD jest już inna technologia i nawet program nagrywający nie pokazuje jak  kursor przechodzi do okna mojego programu. Ale o co chodzi. Wybieram program, gdy daję rysuj i program pyta " Wskaż początek...'' to nie mogę nacisnąć innego przycisku na panelu mojego programu narzędziowego, który by to anulował. Co w AutoCAD jak pokazałem działa sprawnie dzięki kodowi jaki podałem wyżej.

Co mógłbym zrobić, usprawnić w ZwCAD, żeby osiągnąć podobny efekt. W ZwCAD tak jakby całkowicie w chwili pytania nie mam dostępu do żadnych przycisków u góry zarówno tych oprogramowanych przeze mnie jak i tych oryginalnych na wstążce. Kursor pozostaje niejako w oknie (SetFocusToview).

Mam nadzieję, że teraz jest już bardziej klarowne to, o co mi chodzi.

W pierwszym przypadku wciskam przycisk nowej komendy

W drugim muszę wcisnąć przycisk escape i przycisk nowej komendy

Edytowane przez Parikon
Odnośnik do komentarza
Udostępnij na innych stronach

Myślałem o tym, żeby zamiast odczytywać aktywne polecenie ze zmiennej systemowej zamiast z tego:

Dnia 22.06.2017 o 16:06, Parikon napisał:

Autodesk.AutoCAD.Internal.PreviousInput.CommandLineMonitorServices comLineMonServ = Autodesk.AutoCAD.Internal.PreviousInput.CommandLineMonitorServices.Instance(); Autodesk.AutoCAD.Internal.PreviousInput.CommandLineMonitor comMon = comLineMonServ.GetCommandLineMonitor(acDoc);

Umknęło mi że to chodzi o to, że nie da się kliknąć przycisku.

Odnośnik do komentarza
Udostępnij na innych stronach

3 godziny temu, kruszynski napisał:

Dostałem z ZWSOFT przykład okna z przyciskiem, który wydaje się działać tak, jak Pan potrzebuje. HelloWorld.rar

Film

Właśnie wydaje się działać identycznie jak moje okno. Znaczy się, że gdy jest zapytanie nie da się ponownie kliknąć w przycisk, a kliknięcie nie przerywania zapytania.

Jeszcze raz 

Film pierwszy

Odnośnik do komentarza
Udostępnij na innych stronach

Komenda  Helloworld wywołuje okno z przyciskiem HelloWorld. Okno jest w trybie

zza.Application.ShowModelessDialog(form);

Klikając przycisk HelloWorld wyskakuje drugie okno w trybie zza.Application.ShowModalDialog(form1);

W tym oknie będzie przycisk Rysuj, który pyta o punkt wstawienia i jak pokażemy to wstawia napis Helloworld.

I teraz:

- jak jest pytanie o punkt wstawienia chciałbym aby okno pierwsze nie było zablokowane i mógłbym w nim znów kliknąć przycisk Helloworld. Tego nie mogę zrobić w ZwCAD a w AutoCAD mogę.

Odnośnik do komentarza
Udostępnij na innych stronach

Używając okna, jakie przesłałem i standardowych poleceń ZWCADa okno nie jest blokowane. Może Pan to zobaczyć na filmie:

Czy może Pan przerobić przykład do takiej postaci, żeby zaobserwować zachowanie analogiczne jak w Pana aplikacji, ale z wykorzystaniem tylko tego okna i standardowych poleceń ZWCADa?

Może problem jest nie w samym oknie, ale w poleceniu podłączonym pod przycisk?

preview.gif

Odnośnik do komentarza
Udostępnij na innych stronach

Proszę mi wierzyć, że moje okno narzędziowe działa identycznie ze standardowymi przyciskami ZwCAD jak Helloworld. Może Pan pobrać i wypróbować. Nie potrzeba zmiennej.

Być może w ogóle problem nie jest w oprogramowaniu przycisku tylko po wywołaniu okna w trybie Modal a nie modelles. Przy czym w AutoCAD nie ma problemu, gdyż wywołanie nowego okna w trybie modal i wywołanie zapytania nie blokuje okna narzędziowego w trybie modelles.

Jeszcze inaczej to napiszę. Gdy włączę mój program narzedziowy i przykładowy Helloworld i z mojego programu narzędziowego wywołam jakiś przycisk to otwiera się okno w trybie Modal. Tak wywołane okno blokuje wszystko. Wstążki, mój program narzędziowy i program Helloworld. Jednak gdy wcisnę przycisk rysuj to zamykam okno w trybie modal i wykonuje polecenie, które pyta o punkt wstawienie itp. Czyli pojawia się zapytanie. W tym momencie w AutoCAD okno narzedziowe jest dostępne i można na nowo klikać w przyciski. W ZwCAD zarówno moje okno narzędziowe jak i przysłany programik HelloWorld będą dalej zamknięte i najazd na przycisk nie wywoła nawet toolltipa.

Edytowane przez Parikon
Odnośnik do komentarza
Udostępnij na innych stronach

Czyli sekwencja wydarzeń wygląda tak ?
- Otwieramy oknoPI w trybie modeless
- Klikamy przycisk X :
    - Otwiera się okno2 w trybie modal.
    - ZWCAD (wstążka, właściwości, nasz przykładowy niezwiązany z PI program HelloWorld , praca w modelu wszystko inne  ) jest zablokowane
- Klikamy przycisk Y w oknie2 :
    -  okno2 znika
    - ZWCAD jest odblokowany czyli pojawia się podpowiedź, można klikać punkty ?
    - okno2. HelloWorld są zablokowane. wskaźnik się nad nimi nie pokazuje, nie da się kliknąć.  a co ze standardowymi oknami ZWCADa? właściwości, wstążka? można klikać, czy wskaźnik jest "uwięziony" w modelu?

Myślę że istotne może być jak zamyka Pan okno?
W ZRX miałem kiedyś podobny problem, wyłączałem okno, ale nie dało się nic klikać. powodem było to JAK wyłączałem okno. Zrobiłem to wywołując

CWnd::ShowWindow( SW_HIDE )

Okno zniknęło, ale nic się nie dało zrobić. ZRX ma swoje okno , w którym trzeba wywołać:

CAdUiDialog::BeginEditorCommand()

Wtedy odblokowało ZWCADa. Być może tu sytuacja jest analogiczna.

W tym przypadku najbardziej podejrzane jest działanie

ZwSoft.ZwCAD.Internal.Utils.SetFocusToDwgView();


 

Odnośnik do komentarza
Udostępnij na innych stronach

Wygląda na to, że teraz już wszyscy włącznie z ZWSOFT mamy jasność na czym polega problem. Tylko że problem wydaje się być skomplikowany, taką informację otrzymałem od ZWSOFT. Obawiam się więc, że na rozwiązanie będzie trzeba poczekać.
Jako rozwiązanie obejściowe, mogę zaproponować włączanie drugiego okna również w trybie modeless.Pewnie to pociągnie za sobą jakieś komplikacje typu kursor znikający z kontrolek typu EditBox. ale może po kliknięciu przycisku przed ukryciem okna może Pan okno przełączyć do trybu modeless, i dopiero wtedy ukryć?

Odnośnik do komentarza
Udostępnij na innych stronach

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