Adam_x Opublikowano 9 Czerwca 2021 Zgłoś Udostępnij Opublikowano 9 Czerwca 2021 Witam Jest taka strona internetowa : Głównego Urzędu Geodezji i Kartografii : http://services.gugik.gov.pl/nmt/ na niej jest możliwość uzyskania punktu rzędnej wysokościowej znając współrzędną x i y wystarczy wkleić jako link strony dla współrzędnej x=486617 i y=637928 np: https://services.gugik.gov.pl/nmt/?request=GetHByXY&x=486617&y=637928 gdzie x, y - współrzędne w układzie PUWG92 pojawi się wysokość punktu z=110.5 Teraz chodzi o to aby napisać program w LISP, który : - tworzy punkt w ZWCAD, odczytuje jego współrzędne x i y - tworzy adres strony odpowiednio ze współrzędną x i y - łączy się ze stroną internetową i kopiuje podany punkt wysokości z do programu (głównie chodzi o tą część) - przesuwa wcześniej wstawiony punkt na odpowiednią wysokość współrzędnej z Pytanie czy ma ktoś jakiś pomysł i czy jest możliwe by taki program działał w LISP(ZWCAD) ? tutaj mała podpowiedź, gdzieś w internecie znalazłem ale nie wiem jak ten fragment kodu wykorzystać ? (nie jestem aż tak biegły w LISP) (defun c:geturltext ( url / obj rtn ) (if (setq obj (vlax-create-object "winhttp.winhttprequest.5.1")) (progn (setq rtn (vl-catch-all-apply '(lambda nil (vlax-invoke-method obj 'open "GET" url :vlax-false) (vlax-invoke-method obj 'send) (vlax-get-property obj 'responsebody) ) ) ) (vlax-release-object obj) (if (vl-catch-all-error-p rtn) (prompt (vl-catch-all-error-message rtn)) (vl-list->string (mapcar '(lambda ( x ) (lsh (lsh x 24) -24)) (vlax-safearray->list (vlax-variant-value rtn)) ) ) ) ) ) ) z góry dziękuje za każdą podpowiedź Pozdrawiam Adam Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
dmatusz3 Opublikowano 9 Czerwca 2021 Zgłoś Udostępnij Opublikowano 9 Czerwca 2021 Ciekawy temat, dziękuję za informacje. Postaramy się przenalizować jak to zrobić. Czy w grę wchodzi tylko LISP, czy również inne języki np. C#? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 9 Czerwca 2021 Zgłoś Udostępnij Opublikowano 9 Czerwca 2021 Wydaje się, że .NET daje out of box obsługę HTTP i aż się prosi, żeby to zrobić w C#. No to będzie ćwiczenie do zrobienia Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 9 Czerwca 2021 Zgłoś Udostępnij Opublikowano 9 Czerwca 2021 (edytowane) Takie coś na razie mnię wyszło. Komenda zwraca do linii poleceń komunikat z odczytaną rzędną wysokosciową na podstawie odpowiedzi z portalu. Jak ma wstawiać metkę albo blok to trzeba jeszcze pokodzić. Jest również metoda ConvertPoint3dToCoordinate na razie pusta, gdyby zaszła potrzeba wprowadzenia konwersji układów współrzędnych. using System.Net.Http; using ZwSoft.ZwCAD.ApplicationServices; using ZwSoft.ZwCAD.EditorInput; using ZwSoft.ZwCAD.Geometry; using ZwSoft.ZwCAD.Runtime; namespace GetHeightByCoordinates { public static class Commands { [CommandMethod("CK_GetHbyXY")] public static void GetHeightByCoordinateXY() { var (X, Y) = ConvertPoint3dToCoordinate(GetPoint()); var height = GetHeight(X, Y); Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\n{height}"); } public static string GetHeight(double coordinateX, double coordinateY) { string url = $"https://services.gugik.gov.pl/nmt/?request=GetHByXY&x={coordinateX}&y={coordinateY}"; return new HttpClient().GetAsync(url).Result.Content.ReadAsStringAsync().Result; } private static Point3d GetPoint() { PromptPointOptions pPtOpts = new PromptPointOptions("\nWskaz punkt na mapie: "); PromptPointResult pPtRes = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts); return pPtRes.Value; } private static (double X, double Y) ConvertPoint3dToCoordinate(Point3d point) { // convert pick point to coordinates return ( point.X, point.Y ); } } } cały projekt do ściągnięcia z Github'a https://github.com/TomekTkaczyk/GetHeightByCoordinates Edytowane 10 Czerwca 2021 przez perlon dmatusz3 i kruszynski 1 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Adam_x Opublikowano 10 Czerwca 2021 Autor Zgłoś Udostępnij Opublikowano 10 Czerwca 2021 21 godzin temu, dmatusz3 napisał: Ciekawy temat, dziękuję za informacje. Postaramy się przenalizować jak to zrobić. Czy w grę wchodzi tylko LISP, czy również inne języki np. C#? Witam Najlepiej w LISP. Program ma działać z programu ZWCAD, automatycznie. Wpisuje komendę lub klikam przycisk polecenia w ZWCAD i działa, tak by było najlepiej. perlon - a ten ".NET" można powiązać z przyciskiem polecenia lub poprzez jakieś polecenie wpisywane w ZWCAD ? ja tylko wiem o obsłudze LISP i Visual Basic przez ZWCAD. pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 10 Czerwca 2021 Zgłoś Udostępnij Opublikowano 10 Czerwca 2021 (edytowane) Zaktualizowałem repozytorium o opis działania. Repo jest tak zrobione, że po uruchomieniu Debug w VStudio powinien sie odpalić ZwCAD2020 automatycznie załadować dll i uruchomić komendę. W przypadku posiadania innej wersji należy zaktualizować property projektu. Ładowanie skompilowanej dll'ki z lispa: (vl-load-com) (vl-cmdf "netload" "GetHeightByCoordinates.dll") Ewentualnie trzeba dodać z przodu .dll ścieżkę dostępu. Wywołanie z linii komend CK_GetHbyXY lub z lispa (command "CK_GETHBYXY") Powyższe można wywołać we własnych lispach (na razie komunikat jest wysyłany tylko na konsolę) lub podpiąć pod menu lub przycisk na toolbarsie. W załączeniu skompilowana dll'ka. Na chwilę obecną komenda zwraca jedynie komunikat o uzyskanej rzędnej wysokościowej. Tak dla sprawdzenia możliwości. Dalsza obróbka pozyskanej iniformacji wedle wymagań. Jak sprecyzujesz co chcesz konkretnie uzyskać to mogę to dopisać. W kodzie użyłem krotek, dlatego wymagany jest dostęp do System.ValueTuple.dll który również załączam. GetHeightByCoordinates.dll System.ValueTuple.dll Edytowane 10 Czerwca 2021 przez perlon dmatusz3 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 10 Czerwca 2021 Zgłoś Udostępnij Opublikowano 10 Czerwca 2021 W dniu 9.06.2021 o 09:40, Adam_x napisał: Pytanie czy ma ktoś jakiś pomysł i czy jest możliwe by taki program działał w LISP(ZWCAD) ? W ZWCAD program działa , dorobiłem tylko odwołanie do funkcji. Całość wygląda tak: (defun URL:Get ( url / *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nURL:Get:*error*: " ) (princ msg ) (princ "\n") ) ) ) (if (setq obj (vlax-create-object "winhttp.winhttprequest.5.1")) (progn (setq rtn (vl-catch-all-apply '(lambda nil (vlax-invoke-method obj 'open "GET" url :vlax-false) (vlax-invoke-method obj 'send) (vlax-get-property obj 'responsebody) ) ) ) (vlax-release-object obj) (if (vl-catch-all-error-p rtn) (prompt (vl-catch-all-error-message rtn)) (vl-list->string (mapcar '(lambda ( x ) (lsh (lsh x 24) -24)) (vlax-safearray->list (vlax-variant-value rtn)) ) ) ) ) ) ) (defun GUKiK:H ( coords / ; (setq coords (list 486617 637928 ) ) *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nPoint:GetHByGUKiK:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq url (strcat "https://services.gugik.gov.pl/nmt/?request=GetHByXY&x=" (rtos (car coords) ) "&y=" (rtos (cadr coords)) "" ) ) (setq H (URL:Get url) ) (atof h) ) A uruchomić można tak (GUKiK:H (list 486617 637928 ) ) albo nawet tak: wskazując punkt w przestrzeni (GUKiK:H (getpoint "\nWskaż punkt: " ) ) Wystarczy plik z załącznika wczytać do ZWCADa poleceniem appload. GUKiK.lsp dmatusz3 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
dmatusz3 Opublikowano 10 Czerwca 2021 Zgłoś Udostępnij Opublikowano 10 Czerwca 2021 Jeśli ktoś pobierze pliki dll, to będzie zapewne trzeba je odblokować. Poniżej film jak to zrobić. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 10 Czerwca 2021 Zgłoś Udostępnij Opublikowano 10 Czerwca 2021 Taka mała aktualizacja. Dorobiłem wstawianie punktów z wysokością odczytaną z serwisu. Polecenie które możemy wpisać by uruchomić funkcję : WstawPunkt GUKiK.lsp Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
dmatusz3 Opublikowano 10 Czerwca 2021 Zgłoś Udostępnij Opublikowano 10 Czerwca 2021 Jeszcze chciałem zapytać, do czego i w jaki sposób można wykorzystać taką funkcję? Do tworzenia map cyfrowych terenu? @Adam_x może masz jakieś przykłady? Wtedy moglibyśmy zastanowić się nad opracowaniem dalszych etapów. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Adam_x Opublikowano 14 Czerwca 2021 Autor Zgłoś Udostępnij Opublikowano 14 Czerwca 2021 Witam W dniu 10.06.2021 o 13:58, dmatusz3 napisał: Jeszcze chciałem zapytać, do czego i w jaki sposób można wykorzystać taką funkcję? Do tworzenia map cyfrowych terenu? @Adam_x może masz jakieś przykłady? Wtedy moglibyśmy zastanowić się nad opracowaniem dalszych etapów. np: do stworzenia profilu ścieżki podejścia lądowania samolotów czy helikopterów czy też sprawdzenia na jakiej głębokości umieścić studnię kablową itd. architektom, konstruktorom też by się przydało oczywiście dla dokładnych pomiarów trzeba wynająć geodetę, ale do wstępnych wyliczeń może się taka funkcja przydać. jak miałbym każdy punkt teraz wpisywać do strony internetowej czy w jakimś innym programie robić i importować do ZWCADA to bym się chyba powiesił ps. perlon, kruszynski, dmateusz3 dziękuje za pomoc. pozdrawiam alf i Mery 1 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi