perlon

Użytkownik forum
  • Postów

    434
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    36

Aktywność reputacji

  1. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w jednostki   
    Zapewne po wyniku końcowym wyrażenia należy dodać oczekiwaną jednostkę.

    Gdyby chodziło o coś innego to musisz wstawić przykładowy arkusz.
  2. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Kopiowanie wraz z obracaniem   
    Komenda MOCORO z dawnego Expressa ale to było w jakimś vlx-ie. Zamiennik znaleziony na autodeskowym forum. Nie wiem czy przejdzie link.
    Żeby skrócić działanie można to to sobie owrapować commandem jeżeli zależy ci na jakiejś konkretnej kolejności operacji.
  3. Upvote
    perlon otrzymał(a) reputację od kruszynski w Kopiowanie wraz z obracaniem   
    Komenda MOCORO z dawnego Expressa ale to było w jakimś vlx-ie. Zamiennik znaleziony na autodeskowym forum. Nie wiem czy przejdzie link.
    Żeby skrócić działanie można to to sobie owrapować commandem jeżeli zależy ci na jakiejś konkretnej kolejności operacji.
  4. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Prostokąt obejmujący MTEXT i transformacje układów współrzędnych   
    Niestety powyższe nie działa prawidłowo w każdym przypadku orientacji UCS i samego MText. Uzupełniłem kod o odpowiednie translacje żeby rozwiązać, albo raczej ominąć problem. Ponieważ nie mogę już edytować poprzedniego postu załączam kod ponownie. Zmieniłem również definicję dwóch funkcji z TransMatrix.lsp. Dlatego zamieszczam pliki ponownie z prośbą do admina o usunięcie poprzednich wersji. Dorzuciłem również pewien test funkcji acet-geom-mtxtbox oraz plik dwg, który obrazuje problem jej wykorzystania wraz z nagraniem testu.
    Test rysuje proste linie w przestrzeni żeby uniknąć narzutu polilinii. Czy jest gdzieś dostępna dokumentacja funkcji acet-geom-mtxtbox bo powyższe zrobiło mii nieco zamieszania w głowie.
    MTextBox.lsp TransMatrix.lsp
    mtb.dwg
  5. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Prostokąt obejmujący MTEXT i transformacje układów współrzędnych   
    acet-geom-mtxtbox zwraca obszar obramowania mtext  ale rzutuje go na płaszczyznę X-Y WCS a w przypadku kiedy MTEXT nie jest równoległy do tej płaszczyzny to obramowanie dostaje dziwnej translacji. Dlatego Postanowiłem ominąć ten problem poprzez transformację obiektu jak poniżej :
    ; ============================================================================================= ; ; c:MTextBox - enclose mtext in a box and place leader for callout ; ; --------------------------------------------------------------------------------------------- ; ; ©2024 by Tomasz Tkaczyk ; ; ============================================================================================= ; (load "CADPL-Pack-v1") (load "TransMatrix") (defun c:MTextBox ( / ent entName origin x-axis y-axis z-axis matrix obj) (if (and (setq entName (car (entsel "Wybierz MTEXT:"))) (= "MTEXT" (cdr (assoc 0 (setq ent (entget entName))))) ) (progn (setq origin (cdr (assoc 10 ent)) x-axis (cdr (assoc 11 ent)) z-axis (cdr (assoc 210 ent)) y-axis (cd:T3D_NormalVector '(0 0 0) z-axis x-axis) matrix (cd:T3D_TransformMatrix x-axis y-axis z-axis origin) obj (vlax-ename->vla-object entname) ) (vla-TransformBy obj (vlax-tmatrix (cd:T3D_InvertMatrix matrix))) (vla-TransformBy (cd:ACX_AddLWPolyline (cd:ACX_ASpace) (acet-geom-mtxtbox (entget entname) 0) T) (vlax-tmatrix matrix) ) (vla-TransformBy obj (vlax-tmatrix matrix)) ) ) ) Powyższe wymaga kilku funkcji do transformacji obiektów w przestrzeni. Zebrałem trochę kodu w krótką biblioteczkę : 
    (princ "\nŁadowanie biblioteki TransMatrix............") ;;; ========================================================================================= ; ;;; TransMatrix.lsp ; ;;; [2024-10-29] ©2024 by Tomasz Tkaczyk ; ;;; ========================================================================================= ; ; [T3D] ===================================================================================== ; ; c:UCSZDIR - Zwraca wektor normalny aktualnego lokalnego układu ; ; współrzędnych ; ; cd:T3D_NormalizeVector - Normalizuje odległość między punktami do wektora jednostkowego; ; cd:T3D_NormalVector - Zwraca wektor normalny do płaszczyzny określonej ; ; trzema punktami ; ; cd:T3D_ASin - Zwraca arcus sinus kąta wyrażonego w radianach ; ; cd:T3D_ACos - Zwraca arcus cosinus kąta wyrażonego w radianach ; ; cd:T3D_Angle3PtsVC - Zwraca kąt między odciankami p0-p1 p0-p2 (rachunek wektorowy) ; ; cd:T3D_Angle3PtsTC - Zwraca kąt między odciankami p0-p1 p0-p2 (twierdzenie Carnota); ; cd:T3D_Elev - Zwraca elewację punktu nad płaszczyzną p0-p1-p2 ; ; cd:T3D_ProjectPt - Zwraca punkt rzutowany na płaszczyznę p0-p1-p2 ; ; cd:T3D_TransformMatrix - Zwraca macierz transformacji do układu x-y-z-origin ; ; cd:T3D_InvertMatrix - Zwraca macierz odwrotną do macieży transformacji ; ; cd:T3D_CompositionTwoMatrices - Zwraca wynik mnożenia dwóch macierzy transformacji ; ; =========================================================================================== ; ; =========================================================================================== ; ; Zwraca wektor normalny aktualnego lokalnego układu współrzędnych ; ; ------------------------------------------------------------------------------------------- ; ; (c:UCSZDIR) ; ; =========================================================================================== ; (defun c:UCSZDIR () (trans '(0 0 1) 1 0 T) ) ; =========================================================================================== ; ; Zwraca wektor jednostkowy odległości między dwoma punktami punktami ; ; p1 p2 - punkty w przestrzeni 3D ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_UnitVector p0 p1) ; ; =========================================================================================== ; (defun cd:T3D_UnitVector(p0 p1) (if (not (equal p0 p1 1e-009)) (mapcar '(lambda (x) (/ x (distance p0 p1))) (mapcar '- p1 p0) ) ) ) ; =========================================================================================== ; ; Zwraca wektor normalny do płaszczyzny określonej trzema punktami ; ; w przestrzeni zgodnej z reguła prawej dłoni ; ; p0 p1 p2 - punkty w przestrzeni 3D ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_NormalVector p0 p1 p2) ; ; =========================================================================================== ; (defun cd:T3D_NormalVector (p0 p1 p2 / normal) (cond ( (inters p0 p1 p0 p2) (foreach p '(p1 p2) (set p (mapcar '- (eval p) p0))) (setq normal (list (- (* (cadr p1) (caddr p2)) (* (caddr p1) (cadr p2))) (- (* (caddr p1) (car p2)) (* (car p1) (caddr p2))) (- (* (car p1) (cadr p2)) (* (cadr p1) (car p2))) ) normal (mapcar '(lambda (x) (* x (/ 1 (distance '(0 0 0) normal)))) normal) ) ) ) ) ; =========================================================================================== ; ; Zwraca arcus sinus kąta wyrażonego w radianach ; ; ------------------------------------------------------------------------------------------- ; ; (ccd:T3D_ASin ang) ; ; =========================================================================================== ; (defun cd:T3D_ASin (ang) (if (<= -1 ang 1) (atan ang (sqrt (- 1 (expt ang 2)))) ) ) ; =========================================================================================== ; ; Zwraca arcus cosinus kąta wyrażonego w radianach ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_ACos ang) ; ; =========================================================================================== ; (defun cd:T3D_ACos (ang) (if (<= -1 ang 1) (atan (sqrt (- 1 (expt ang 2))) ang) ) ) ; =========================================================================================== ; ; Zwraca kąt między odciankami p0-p1 a p0-p2 (rachunek wektorowy) ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_Angle3PtsVC p0 p1 p2) ; ; =========================================================================================== ; (defun cd:T3D_Angle3PtsVC (p0 p1 p2 / v1 v2) (if (and (setq v1 (cd:T3D_UnitVector p0 p1)) (setq v2 (cd:T3D_UnitVector p0 p2)) ) (cond ((equal v1 v2 1e-009) 0.0) ((equal v1 (mapcar '- v2) 1e-009) pi) (T (* 2 (cd:T3D_ASin (/ (distance v1 v2) 2)))) ) ) ) ; =========================================================================================== ; ; Zwraca kąt między odciankami p0-p1 a p0-p2 (twierdzenie Carnota) ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_Angle3PtsTC p0 p1 p2) ; ; =========================================================================================== ; (defun cd:T3D_Angle3PtsTC (p0 p1 p2 / d1 d2 d3) (setq d1 (distance p0 p1) d2 (distance p0 p2) d3 (distance p1 p2) ) (if (and (not (zerop d1)) (not (zerop d2))) (cd:T3D_ACos (/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3))) (* 2 d1 d2)) ) ) ) ; =========================================================================================== ; ; Zwraca elewację punktu nad płaszczyzną p0-p1-p2 ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_Elev pt p0 p1 p2) ; ; =========================================================================================== ; (defun cd:T3D_Elev (pt p0 p1 p2) (* (cos (cd:T3D_Angle3PtsVC p0 (mapcar '+ p0 (cd:T3D_NormalVector p0 p1 p2)) pt)) (distance p0 pt) ) ) ; =========================================================================================== ; ; Zwraca punkt rzutowany na płaszczyznę p0-p1-p2 ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_ProjectPt pt p0 p1 p2) ; ; =========================================================================================== ; (defun cd:3D_ProjectPt (pt p0 p2 p3) (mapcar '- pt (mapcar '(lambda (x) (* x (cd:T3D_Elev pt p0 p1 p2))) (cd:T3D_NormalVector p0 p1 p2) ) ) ) ; =========================================================================================== ; ; Zwraca macież transformacji do układu x-y-z-origin ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_TransformMatrix x-axis y-axis z-axis origin) ; ; =========================================================================================== ; (defun cd:T3D_TransformMatrix (x-axis y-axis z-axis origin) (list (list (nth 0 x-axis) (nth 0 y-axis) (nth 0 z-axis) (nth 0 origin)) (list (nth 1 x-axis) (nth 1 y-axis) (nth 1 z-axis) (nth 1 origin)) (list (nth 2 x-axis) (nth 2 y-axis) (nth 2 z-axis) (nth 2 origin)) (list 0 0 0 1) ) ) ; =========================================================================================== ; ; Zwraca macież odwrotną do macierzy transformacji ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_InvertMatrix matrix) ; ; =========================================================================================== ; (defun cd:T3D_InvertMatrix( tmatrix / m00 m01 m02 m03 m10 m11 m12 m13 m20 m21 m22 m23 m30 m31 m32 m33 inv00 inv01 inv02 inv10 inv11 inv12 inv20 inv21 inv22) ;; Pobierz elementy macierzy z listy list (setq m00 (nth 0 (nth 0 tmatrix)) m01 (nth 1 (nth 0 tmatrix)) m02 (nth 2 (nth 0 tmatrix)) m03 (nth 3 (nth 0 tmatrix)) m10 (nth 0 (nth 1 tmatrix)) m11 (nth 1 (nth 1 tmatrix)) m12 (nth 2 (nth 1 tmatrix)) m13 (nth 3 (nth 1 tmatrix)) m20 (nth 0 (nth 2 tmatrix)) m21 (nth 1 (nth 2 tmatrix)) m22 (nth 2 (nth 2 tmatrix)) m23 (nth 3 (nth 2 tmatrix)) m30 (nth 0 (nth 3 tmatrix)) m31 (nth 1 (nth 3 tmatrix)) m32 (nth 2 (nth 3 tmatrix)) m33 (nth 3 (nth 3 tmatrix)) ) ;; Oblicz transpozycję macierzy rotacji (górna lewa 3x3) (setq inv00 m00 inv01 m10 inv02 m20 inv10 m01 inv11 m11 inv12 m21 inv20 m02 inv21 m12 inv22 m22 ) ;; Oblicz odwrotny wektor translacji (setq inv03 (- (+ (* inv00 m03) (* inv01 m13) (* inv02 m23))) inv13 (- (+ (* inv10 m03) (* inv11 m13) (* inv12 m23))) inv23 (- (+ (* inv20 m03) (* inv21 m13) (* inv22 m23))) ) ;; Skonstruuj macierz wynikową (list (list inv00 inv01 inv02 inv03) (list inv10 inv11 inv12 inv13) (list inv20 inv21 inv22 inv23) (list 0 0 0 1) ) ) ; =========================================================================================== ; ; Zwraca wynik mnożenia dwóch macierzy transformacji ; ; ------------------------------------------------------------------------------------------- ; ; (cd:T3D_CompositionTwoMatrices matrixA matrixB) ; ; =========================================================================================== ; (defun cd:T3D_CompositionTwoMatrices (A B) (list (list (+ (* (nth 0 (nth 0 A)) (nth 0 (nth 0 B))) (* (nth 1 (nth 0 A)) (nth 0 (nth 1 B))) (* (nth 2 (nth 0 A)) (nth 0 (nth 2 B)))) (+ (* (nth 0 (nth 0 A)) (nth 1 (nth 0 B))) (* (nth 1 (nth 0 A)) (nth 1 (nth 1 B))) (* (nth 2 (nth 0 A)) (nth 1 (nth 2 B)))) (+ (* (nth 0 (nth 0 A)) (nth 2 (nth 0 B))) (* (nth 1 (nth 0 A)) (nth 2 (nth 1 B))) (* (nth 2 (nth 0 A)) (nth 2 (nth 2 B)))) (+ (* (nth 0 (nth 0 A)) (nth 3 (nth 0 B))) (* (nth 1 (nth 0 A)) (nth 3 (nth 1 B))) (* (nth 2 (nth 0 A)) (nth 3 (nth 2 B))) (nth 3 (nth 0 A))) ) (list (+ (* (nth 0 (nth 1 A)) (nth 0 (nth 0 B))) (* (nth 1 (nth 1 A)) (nth 0 (nth 1 B))) (* (nth 2 (nth 1 A)) (nth 0 (nth 2 B)))) (+ (* (nth 0 (nth 1 A)) (nth 1 (nth 0 B))) (* (nth 1 (nth 1 A)) (nth 1 (nth 1 B))) (* (nth 2 (nth 1 A)) (nth 1 (nth 2 B)))) (+ (* (nth 0 (nth 1 A)) (nth 2 (nth 0 B))) (* (nth 1 (nth 1 A)) (nth 2 (nth 1 B))) (* (nth 2 (nth 1 A)) (nth 2 (nth 2 B)))) (+ (* (nth 0 (nth 1 A)) (nth 3 (nth 0 B))) (* (nth 1 (nth 1 A)) (nth 3 (nth 1 B))) (* (nth 2 (nth 1 A)) (nth 3 (nth 2 B))) (nth 3 (nth 1 A))) ) (list (+ (* (nth 0 (nth 2 A)) (nth 0 (nth 0 B))) (* (nth 1 (nth 2 A)) (nth 0 (nth 1 B))) (* (nth 2 (nth 2 A)) (nth 0 (nth 2 B)))) (+ (* (nth 0 (nth 2 A)) (nth 1 (nth 0 B))) (* (nth 1 (nth 2 A)) (nth 1 (nth 1 B))) (* (nth 2 (nth 2 A)) (nth 1 (nth 2 B)))) (+ (* (nth 0 (nth 2 A)) (nth 2 (nth 0 B))) (* (nth 1 (nth 2 A)) (nth 2 (nth 1 B))) (* (nth 2 (nth 2 A)) (nth 2 (nth 2 B)))) (+ (* (nth 0 (nth 2 A)) (nth 3 (nth 0 B))) (* (nth 1 (nth 2 A)) (nth 3 (nth 1 B))) (* (nth 2 (nth 2 A)) (nth 3 (nth 2 B))) (nth 3 (nth 2 A))) ) (list 0 0 0 1) ) ) (princ " Załadowane") (princ "\nTransMatrix v.0.1 ©2024 by Tomasz Tkaczyk") (princ "\nbased from gile on https://www.theswamp.org/index.php?topic=11561.0") (princ)  Powyższe otwiera drogę do modyfikacji programu do rysowania obramowania grupy obiektów dowolnie zorientowanych w przestrzeni na płaszczyźnie X-Y aktualnego UCS'a również dowolnie zorientowanego z uwzględnieniem również obiektów typu MTEXT.
     
  6. Like
    perlon przyznał(a) reputację dla kojacek w Prostokąt obejmujący MTEXT i transformacje układów współrzędnych   
    Potrzebujesz:
    1) (załadowanego) CADPL-Pack'a (wiadomo)
    2) funkcji z Express Tools: acet-geom-mtxtbox (oprócz AutoCAD-a jest w BricsCAD-zie i GStar'ze. Nie wiem jak jest w ZwCAD-ie)
    3) Poniższego kawałka kodu:
     
    ;;;  ramka MTEXTu (2024 by kojacek) (defun C:MTEST (/ %e %d %p %o %z)   (if     (and       (setq %e (car (entsel "\Wybierz MTEXT:")))       (= "MTEXT" (cdr (assoc 0 (setq %d (entget %e)))))     )     (progn       (setq %p (acet-geom-mtxtbox %d 0.0)             %z (cdr (assoc 210 %d))             %p (mapcar                  '(lambda (%)                     (trans % 1 %z)                  ) %p                )       )       (setq %o (cd:ACX_AddLWPolyline (cd:ACX_ASpace) %p t))       (vla-TransformBy %o (cd:CON_TransMatrix 0))     )     (princ "\nZły wybór.")   ) ) Z tego co na szybko przetestowałem, maluje prostokąt dla wskazanego MTEXT-u, niezależnie od aktywnego układu współrzednych. Funkcja acet-geom-mtxtbox, zwraca współrzędne prostokata opisującego rzeczywisty obszar MTEXT-u (porównaj z ramką MTEXT-u). Swego czasu poruszałem to tu: https://kojacek.wordpress.com/2017/10/08/wielkosc-obszaru-mtext-u/. Drugi argument funkcji (tutaj 0.0), to odsunięcie prostokąta. Pozwala to na rysowanie większego obramowania. 
  7. Like
    perlon przyznał(a) reputację dla Pawel.G w Brakujące SHX, kontynuacja tematu   
    Dla potomnych,
    znalazłem lips, który rozwiązuje sprawę podmieniając brakujące elementy na podstawowe:
    (defun C:RSHX () (vl-load-com) (vlax-for item (vla-get-textstyles (vla-get-ActiveDocument (vlax-get-acad-object)) ) (if (not (vl-filename-extension (setq fname (vla-get-fontfile item))) ) (setq fname (strcat fname ".shx")) ) (cond ((findfile fname) nil) ((findfile (strcat (getenv "WINDIR") "\\FONTS\\" fname)) nil ) (t (vla-put-fontfile item "ltypeshp.shx") (princ "\nChange ") (princ fname) (princ " on ltypeshp.shx") ) ) ) (princ) ) (princ "\nRSHX , purge unreferenced shape files")
  8. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Pytanie o użytkowanie komercyjne   
    Nie ma co rozwijać. Na stronie producenta w zakładce History. Na forum autor potwierdzał ważność licencji starszych wersji a te były 100% free dla wszystkich.
    https://smath.com/en-US/view/SMathStudio/history
     
  9. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w LISP - przesuwający obiekty w osi Z co 1 jednostkę   
    Witam
    A może łatwiej by było zamienić ten zestaw linii i łuków w polilinie właśnie i przeprocesować polilinię która już będzie uporządkowana ze swej natury? Kwestia tylko wskazania który koniec jest początkiem. Innym rozwiązaniem mogło by być dodanie XDATA do obiektów linia/łuk ale trzeba do tego też stworzyć system zarządzania kolejnością. Kolejność na podstawie rzędnej Z jak dla mnie wzbudza pewną kontrowersję 
  10. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w ClipXRef i osadzony Image   
    Witam.
    vernum = "22.20_2021.12.16(2dc3d9e9b39)_x64" (read only)
    Mam plik z podłączonym podkładem XRef jako overlay. W owym xref'ie jest osadzony JPG. XRef'a mam przyciętego XClip'em. Wygląda to mniej więcej tak.

    jak zmienię obrys XClipa tak aby nie obejmował obrazka JPG obrazek pojawia się w całości poza granicami XClipa.

    Nie znalazłem żadnego sposobu aby sprawić żeby plik JPG nie był widoczny. Opisane zachowanie występuje w wymienionej wyżej wersji 2022. Ten sam plik otworzony w wersji 2020 nie pokazuje bitmapy poza xclipem ale niestety ta wersja nie daje możliwości modyfikacji xclipa za pomocą uchwytów. Wydaje mi się, że jest to błąd do zgłoszenia do ZwSoft'u.
    Edit:
    Podmieniłem na zrzuty ekranowe i dołączyłem pliki testowe
     

    base.dwg xref.dwg
  11. Upvote
    perlon otrzymał(a) reputację od kruszynski w Tworzenie bloku w lisp oraz instrukcja warunkowa   
    Takie rozwiązanie, które sam stosuję:
    (if (not (tblsearch "LAYER" "jakas_warstwa")) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 "jakas_nazwa") '(70 . 0) '(62 . 7) '(6 . "Continuous") '(370 . -3) ) ) )  
  12. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Tworzenie bloku w lisp oraz instrukcja warunkowa   
    A najprościej to załadować sobie CADPL-Pack i tam jest między innymi :
    ; cd:ACX_AddLayer         - Tworzy nowa warstwe / Creates a new layers                        ;
     
    Pozdrowienia dla Kojacek
     
  13. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Tworzenie bloku w lisp oraz instrukcja warunkowa   
    Takie rozwiązanie, które sam stosuję:
    (if (not (tblsearch "LAYER" "jakas_warstwa")) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 "jakas_nazwa") '(70 . 0) '(62 . 7) '(6 . "Continuous") '(370 . -3) ) ) )  
  14. Upvote
    perlon otrzymał(a) reputację od BKW w 2022 - DIMCONTINUE i PERPENDICULAR OSNAP   
    Nie wiem czy było zgłaszane ale w 2022 jak się rysuje kontynuację wymiaru i jest zaznaczony osnap PERPENDICULAR to złapanie czegokolwiek graniczy z cudem.

  15. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w LISP dla wszystkich otwartych, LTSCALE   
    Podpierając się lispem LeeMac'a można wybrać kartotekę z plikami dwg i w czambuł polecieć wszystkie wygenerowanym skryptem.
    (defun C:LTSALLDWG ( / count dir filename files scriptname) (setq dir (LM:DirectoryDialog "Select directory" "" 1)) (if dir (setq files (vl-directory-files dir "*.dwg" 1)) ) (if files (progn (setq scriptname (open "e:\\temp\\batch.scr" "w") count 0 ) (while (setq filename (nth count files)) (setq filename (strcat dir "\\" filename)) (write-line (strcat "_open \"" filename "\"") scriptname) (write-line (strcat "(vl-cmdf \"" "setvar\"" " " "\"" "ltscale\"" " " "\"1\"" " " "\"" "\"" ")") scriptname) (write-line "_qsave" scriptname) (write-line "_close" scriptname) (setq count (1+ count)) ) (close scriptname) ) ) (princ) ) ;;-------------------=={ Directory Dialog }==-----------------;; ;; ;; ;; Displays a dialog prompting the user to select a folder ;; ;;------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;; ;;------------------------------------------------------------;; ;; Arguments: ;; ;; msg - message to display at top of dialog ;; ;; dir - root directory (or nil) ;; ;; flag - bit coded flag specifying dialog display settings ;; ;;------------------------------------------------------------;; ;; Returns: Selected folder filepath, else nil ;; ;;------------------------------------------------------------;; (defun LM:DirectoryDialog ( msg dir flag / Shell Fold Self Path ) (vl-catch-all-apply (function (lambda ( / ac HWND ) (if (setq Shell (vla-getInterfaceObject (setq ac (vlax-get-acad-object)) "Shell.Application") HWND (vl-catch-all-apply 'vla-get-HWND (list ac)) Fold (vlax-invoke-method Shell 'BrowseForFolder (if (vl-catch-all-error-p HWND) 0 HWND) msg flag dir) ) (setq Self (vlax-get-property Fold 'Self) Path (vlax-get-property Self 'Path) Path (vl-string-right-trim "\\" (vl-string-translate "/" "\\" Path)) ) ) ) ) ) (if Self (vlax-release-object Self)) (if Fold (vlax-release-object Fold)) (if Shell (vlax-release-object Shell)) Path ) ;Symbol Type Description ;msg String Message to display to the top of the dialog (may be an empty string) ;dir String (Optional) Root Directory, user cannot navigate above this level ;flag Integer Bit flags controlling the behaviour of the dialog interface (detailed below) ;Returns: Selected Directory, else nil if user presses Cancel ;Flag Bit Values ;Bit Result ;0 Standard behaviour (Default) ;1 Only file system folders can be selected. If this bit is set, the OK button is disabled if the user selects a folder that doesn't belong to the file system. ;2 The user is prohibited from browsing below the domain within a network ;4 Room for status text is provided under the dialog box ;8 Returns file system ancestors only. An ancestor is a subfolder that is beneath the root folder. If the user selects an ancestor of the root folder that is not part of the file system, the OK button is grayed. ;16 Shows an edit box in the dialog box for the user to type the name of an item. ;32 Validate the name typed in the edit box. ;64 Enable drag-and-drop capability within the dialog box, reordering, shortcut menus, new folders, delete, and other shortcut menu commands. ;128 The browse dialog box can display URLs. ;256 When combined with flag 64, adds a usage hint to the dialog box, in place of the edit box. ;512 Suppresses display of the 'New Folder' button ;1024 When the selected item is a shortcut, return the PIDL of the shortcut itself rather than its target. ;4096 Enables the user to browse the network branch for computer names. If the user selects anything other than a computer, the OK button is grayed. ;8192 Enables the user to browse the network branch for printer names. If the user selects anything other than a printer, the OK button is grayed. ;16384 Allows browsing for everything: the browse dialog box displays files as well as folders. ;32768 If combined with flag 64, the browse dialog box can display shareable resources on remote systems. ;65536 Windows7 & later: Allow folder junctions such as a library or a compressed file with a .zip file name extension to be browsed.  
  16. Like
    perlon otrzymał(a) reputację od alf w LISP dla wszystkich otwartych, LTSCALE   
    Podpierając się lispem LeeMac'a można wybrać kartotekę z plikami dwg i w czambuł polecieć wszystkie wygenerowanym skryptem.
    (defun C:LTSALLDWG ( / count dir filename files scriptname) (setq dir (LM:DirectoryDialog "Select directory" "" 1)) (if dir (setq files (vl-directory-files dir "*.dwg" 1)) ) (if files (progn (setq scriptname (open "e:\\temp\\batch.scr" "w") count 0 ) (while (setq filename (nth count files)) (setq filename (strcat dir "\\" filename)) (write-line (strcat "_open \"" filename "\"") scriptname) (write-line (strcat "(vl-cmdf \"" "setvar\"" " " "\"" "ltscale\"" " " "\"1\"" " " "\"" "\"" ")") scriptname) (write-line "_qsave" scriptname) (write-line "_close" scriptname) (setq count (1+ count)) ) (close scriptname) ) ) (princ) ) ;;-------------------=={ Directory Dialog }==-----------------;; ;; ;; ;; Displays a dialog prompting the user to select a folder ;; ;;------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;; ;;------------------------------------------------------------;; ;; Arguments: ;; ;; msg - message to display at top of dialog ;; ;; dir - root directory (or nil) ;; ;; flag - bit coded flag specifying dialog display settings ;; ;;------------------------------------------------------------;; ;; Returns: Selected folder filepath, else nil ;; ;;------------------------------------------------------------;; (defun LM:DirectoryDialog ( msg dir flag / Shell Fold Self Path ) (vl-catch-all-apply (function (lambda ( / ac HWND ) (if (setq Shell (vla-getInterfaceObject (setq ac (vlax-get-acad-object)) "Shell.Application") HWND (vl-catch-all-apply 'vla-get-HWND (list ac)) Fold (vlax-invoke-method Shell 'BrowseForFolder (if (vl-catch-all-error-p HWND) 0 HWND) msg flag dir) ) (setq Self (vlax-get-property Fold 'Self) Path (vlax-get-property Self 'Path) Path (vl-string-right-trim "\\" (vl-string-translate "/" "\\" Path)) ) ) ) ) ) (if Self (vlax-release-object Self)) (if Fold (vlax-release-object Fold)) (if Shell (vlax-release-object Shell)) Path ) ;Symbol Type Description ;msg String Message to display to the top of the dialog (may be an empty string) ;dir String (Optional) Root Directory, user cannot navigate above this level ;flag Integer Bit flags controlling the behaviour of the dialog interface (detailed below) ;Returns: Selected Directory, else nil if user presses Cancel ;Flag Bit Values ;Bit Result ;0 Standard behaviour (Default) ;1 Only file system folders can be selected. If this bit is set, the OK button is disabled if the user selects a folder that doesn't belong to the file system. ;2 The user is prohibited from browsing below the domain within a network ;4 Room for status text is provided under the dialog box ;8 Returns file system ancestors only. An ancestor is a subfolder that is beneath the root folder. If the user selects an ancestor of the root folder that is not part of the file system, the OK button is grayed. ;16 Shows an edit box in the dialog box for the user to type the name of an item. ;32 Validate the name typed in the edit box. ;64 Enable drag-and-drop capability within the dialog box, reordering, shortcut menus, new folders, delete, and other shortcut menu commands. ;128 The browse dialog box can display URLs. ;256 When combined with flag 64, adds a usage hint to the dialog box, in place of the edit box. ;512 Suppresses display of the 'New Folder' button ;1024 When the selected item is a shortcut, return the PIDL of the shortcut itself rather than its target. ;4096 Enables the user to browse the network branch for computer names. If the user selects anything other than a computer, the OK button is grayed. ;8192 Enables the user to browse the network branch for printer names. If the user selects anything other than a printer, the OK button is grayed. ;16384 Allows browsing for everything: the browse dialog box displays files as well as folders. ;32768 If combined with flag 64, the browse dialog box can display shareable resources on remote systems. ;65536 Windows7 & later: Allow folder junctions such as a library or a compressed file with a .zip file name extension to be browsed.  
  17. Upvote
    perlon przyznał(a) reputację dla dmatusz3 w Wstawianie map WMS z serwerów gov.pl   
    Pracujemy obecnie nad dodaniem do naszych nakładek (np. ZWGeo, ZWTraffic) możliwości wstawiania map z zasobów z portali gov.pl.
    Funkcjonalność jest w bardzo początkowej fazie, ale postanowiliśmy ją udostępnić. 
    Możemy wybrać różne serwery z danymi i sprawdzić jakie udostępnia dane (warstwy). Następnie definiujemy obszar w który ma być wstawiona mapa. Wygląda to tak jak na animacji poniżej.

     
    Biblioteki do pobrania ZWMS.zip
    Pobrany plik zip należy rozpakować do katalogu i poleceniem netload (tylko wersja ZWCAD Pro) wczytać plik ZWMS.dll

    Wtedy pojawi się dodatkowy panel. W pliku zip znajduje się również plik Plik_testowy.dwg, który został użyty podczas kręcenia filmu.
     
     
  18. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Progam do odczytywania rzędnej wysokościowej punktu ?   
    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
  19. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Progam do odczytywania rzędnej wysokościowej punktu ?   
    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
  20. Like
    perlon otrzymał(a) reputację od kruszynski w Progam do odczytywania rzędnej wysokościowej punktu ?   
    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
  21. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Pomoc przy lispie   
    A na czym miałaby polegać ta pomoc? Co chcesz konkretnie osiągnąć. Jaki jest związek bloku z atrybutami z polilinią?
  22. Upvote
    perlon otrzymał(a) reputację od wedzik w Nie działa zmienna w filtrze przy zaznaczaniu ssget   
    Może to pomoże :
    (defun c:okregi (/) (setq malypromien (getreal "Podaj maly promien: ")) (setq aaa '( (0 . "CIRCLE") (410 . "Model") (-4 . ">=")) ) (setq bbb (append aaa (list (cons 40 malypromien)))) (setq zbior (ssget "X" bbb)) (if zbior (princ (setq ile (sslength zbior))) (princ "\nBrak elementow")) (princ) )  
  23. Upvote
    perlon otrzymał(a) reputację od dmatusz3 w Nie działa zmienna w filtrze przy zaznaczaniu ssget   
    Może to pomoże :
    (defun c:okregi (/) (setq malypromien (getreal "Podaj maly promien: ")) (setq aaa '( (0 . "CIRCLE") (410 . "Model") (-4 . ">=")) ) (setq bbb (append aaa (list (cons 40 malypromien)))) (setq zbior (ssget "X" bbb)) (if zbior (princ (setq ile (sslength zbior))) (princ "\nBrak elementow")) (princ) )  
  24. Like
    perlon przyznał(a) reputację dla kojacek w [AutoLisp] Zmiana widoczności warstwy.   
    Byłoby dziwne gdyby wpółpracował. Lista z tblsearch nie jest poprawną listą dla entmod. Użyj tu formy entget + tblobjname. Zobacz:
    (setq e (tblobjname "layer" "zbrojenie_linie" )) (setq d (entget e)) (entmod (subst (cons 62 -8)(assoc 62 d) d)) a to prowadzić może do bardziej ogólnej funkcji:
    (defun LayOnOff (Lay / e d)   (if     (setq e (tblobjname "LAYER" Lay))     (progn       (setq d (entget e))       (setq d         (subst           (cons 62             (* -1 (cdr (assoc 62 d)))           )           (assoc 62 d)         d)       )       (entmod d)     )   ) ) Funkcja steruje widocznością warstwy podanej jako jej argument tak jak przełącznik, wywołaj kolejno:
    (LayOnOff "zbrojenie_linie")  
  25. Like
    perlon otrzymał(a) reputację od Marek-M w Co dzisiaj robiłem w lispie?   
    LISP to fajna zabawa, choć nie na darmo ukuło się rozwinięcie tego skrótu : 
    LISP = Lost in Stupid Parenthesis