perlon

Użytkownik forum
  • Content Count

    360
  • Joined

  • Last visited

  • Days Won

    25

perlon last won the day on July 27

perlon had the most liked content!

2 Followers

About perlon

  • Rank
    Średniozaawansowany

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Uwaga ogólna: Oddzielaj kod obsługi zdarzeń od kodu wykonawczego. Kod wykonawczy dziel na mniejsze funkcje. Spagetti code jest trudny do analizy i testowania. Jeżeli kod wykonawczy tworzy encje to te encje twórz w podfunkcjach które będą je zwracały do kodu wykonawczego. Zgromadzone encje do zgrupowania przekaż do osobnej funkcji jako argument. Funkcja ta powinna zwrócić identyfikator grupy. Co do grupowania to może taki krótki przykład pomoże Function Rysuj() Dim Points(3) As Double Dim PIERWSZY, DRUGI, TRZECI, CZWARTY As Variant Dim ObjectsToGroup(1) As ZcadEntity Dim Group As ZcadGroup PIERWSZY = ThisDrawing.Utility.GetPoint(, "Podaj punkt P1 (początek pręta):") DRUGI = ThisDrawing.Utility.GetPoint(PIERWSZY, "Podaj punkt P2 (koniec pręta):") Points(0) = PIERWSZY(0) Points(1) = PIERWSZY(1) Points(2) = DRUGI(0) Points(3) = DRUGI(1) Set ObjectsToGroup(0) = ThisDrawing.ModelSpace.AddLightWeightPolyline(Points) PIERWSZY = ThisDrawing.Utility.GetPoint(, "Podaj punkt P1 (początek pręta):") DRUGI = ThisDrawing.Utility.GetPoint(PIERWSZY, "Podaj punkt P2 (koniec pręta):") Points(0) = PIERWSZY(0) Points(1) = PIERWSZY(1) Points(2) = DRUGI(0) Points(3) = DRUGI(1) Set ObjectsToGroup(1) = ThisDrawing.ModelSpace.AddLightWeightPolyline(Points) Set Group = ToGroup(ObjectsToGroup) End Function Function ToGroup(Objects() As ZcadEntity) As ZcadGroup Dim GroupObject As ZcadGroup Set GroupObject = ThisDrawing.Groups.Add("*") GroupObject.AppendItems Objects Set ToGroup = GroupObject End Function
  2. Jak na moje oko (choć nie programuję na co dzień VBA) to powinno działać. Enter powinien powtórzyć ostatnią komendę czyli ZPP. Pod ikonkę w toolbarsie powinna być podpięta komenda z lispa czyli zpp. Sprawdź taki test. U mnie działa. Musisz tylko poprawić ścieżkę do pliku Project.zvb. Konfiguracja buttona w toolbarsie: project.lsp Project.zvb
  3. W zasadzie SPM zachowuje się jak PPM choć w konfiguracji CUI jest coś innego
  4. U mnie myszka też coś szwankuje. Mam taką jak na zrzucie i tak skonfigurowaną Na środkowy przycisk w ogóle nie reaguje. Nie ważne czy przyciska 3 czy 4 czy 5. Wszystkie są skonfigurowane jako środkowy przycisk myszy. Mbuttonpan na 0. Działa dwuklik na środkowym przycisku robiąc zoom all. Jak ustawię mbuttonpan na 1 to łapka na środkowym przycisku działa, ale ja potrzebuję menu podręcznego. Nie działa również Shift+PPM 😞 Schift+SPM czyli 3DOrbit działa. Bez menu podręcznego w praktyce program dla mnie jest nie używalny.
  5. Może wystarczy command : (defun c:nazwa_makra (/) (command "-VBARUN" "nazwa_makra") ) (command "nazwa_makra") Takie coś podpiąć pod toolbarsa i będzie powtarzalne po enterze Tak na marginesie w wersji EN jest literówka
  6. Niestety winowajca był wytypowany przedwcześnie. Żonglując domyślnym programem do dwg udało mi się otworzyć plik prawidłowo, ale zdarzało się że na "pusto" też wyskakiwał mi crash report. Tak więc widzę, że problem jest bardziej złożony o niewyjaśnionym podłożu. Na tą chwilę utraciłem powtarzalność zachowania.
  7. Mam rysunki, do których są zaimportowane dokumenty pdf, które są skanami dokumentacji papierowej. Czyli bitmapa wepchnięta do pdf jako podkład do rysowania. W 2020 otwiera się normalnie w 2021 wywala crash report 😞 Recover nie przynosi efektu, tym bardziej, że w 2020 się otwiera.
  8. Tak sobie to oglądnąłem i wg mnie oba atrybuty w różnych blokach dostawały różne pozycje. Tyle tylko, że RZD jest puste. Być może LISP, który to ogarnia mógłby albo na sztywno obrabiać jeden konkretny atrybut z definicji konkretnego bloku albo posiadać okienkowy UI pozwalający na wybór atrybutu, który należy przemieścić. Uniwersalne i "sprytne" narzędzie raczej nie będzie trywialne. Ciekawe ćwiczenie programistyczne
  9. Jak dla mnie wygląda OK. Jedyne co jeżeli AddDocEvent posiada tylko jedno przypisanie delegaty to można śmiało to przenieść do Initialize(). Trzeba jeszcze pamiętać, że jeżeli wstawimy ładowanie biblioteki .net do autostartu ZwCAD'a to metoda Initialize wykona się zanim będzie stworzony pusty dokument dwg, a tym samym WywolajPrzyStarcie() może próbować operować na obiekcie dokumentu który nie istnieje. Trzeb tam dodać stosowne bezpieczniki. Tak przy okazji. Czy ktoś sprawdzał jakie reguły rządzą uruchamianiem metody initialize() klasy z interfejsem IExtensionApplication jeżeli takich klas jest więcej niż jedna w module. Jak dla mnie jest to losowe i jest uruchamiana tylko z jednej klasy. Pozostałe klasą są ignorowane. Ponadto zauważyłem, że jeżeli jakiś moduł jest automatycznie ładowany jako zależność modułu nadrzędnego to klasy IExtensionApplication są również ignorowane.
  10. Wydaje się, że link we wpisie na blogu jest nieużywalny z poniższego powodu: https://www.wirtualnemedia.pl/artykul/onet-zamyka-serwis-republika-www-ale-nie-rezygnuje-z-uslug-hostingowych
  11. Samo polecenie WIPEOUT -> Ramki -> Tak/Nie Nie daje trzeciej możliwości a mianowicie wartość 2 pokazuje ramki co pozwala je "chwycić" ale ich nie ma na wydruku
  12. Dobry sposób jeżeli przy starcie ZwCAD'a ładuję jakąś aplikację .NET'ową. W zasadzie funkcjonalnie jest tożsame z ustawieniem w ZWCAD2020.lsp Dodatkowo można by było jeszcze założyć trigger na odtworzenie poprzedniego stanu tej zmiennej przy zamknięciu pliku.
  13. Tak. Wprowadziłem tą zmienną na starcie. Ale niestety kłóci to się z zasadą, że zmienna jest przechowywana wewnątrz pliku dwg. Jeżeli zaistnieje powód, dla którego chciałbym w jednym pliku mieć te kontury to taki wpis namiętnie będzie mi to zmieniał. Szukałem sposobu na pierwszorazowe startowe ustawienie na 0 a nie na permanentne ustawianie na 0. A mam w swojej robocie sytuacje w których "produkuję" dużo rysunków dwg z bocada które później przekazuję w pdf i dwg do wykonawstwa. Chciałbym aby w przekazywanych rysunkach było WIPEOUT na 0 i nie zawsze pamiętam żeby to zmienić. Więc wczoraj wieczorem sprokurowałem sobie takiego oto lispa któy tworzy i odpala skrypt scr, który to skrypt załatwia jednorazowo ustawienie tej zmiennej. Do wskazania kartoteki posiłkowałem się kodem Lee Mac. Zabawka może posłużyć do kreowania skryptów które mogą robić jeszczde inne rzeczy hurtowo. Już chodzi mi po głowie jakiś edytorek skryptu operującego na pojedyńczym pliku i jego wielokrotne użycie na kolekcji plików. (vl-load-com) ;;-------------------=={ 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 ) ;To właściwe działanie (defun C:WipeOutFrameOff ( / script dir filelist file) (setq dir (LM:DirectoryDialog "" "" 1)) (setq filelist (vl-directory-files dir "*.dwg")) (setq script (open (strcat dir "//script.scr") "w")) (foreach file filelist ; tu możemy sobie wpisać co tam chcemy zrobić na pliku (progn (write-line "_open" script) (write-line (strcat dir "\\" file) script) (write-line "_zoom _e _zoom 0.8x" script) (write-line "(setvar \"WIPEOUTFRAME\" 0)" script) (write-line "_qsave" script) (write-line "_close" script) ) ) (close script) ; no i na koniec odpalamy skrypt (command "_.script" (strcat dir "\\script")) ) (prompt "\nWipeOutFrameOff loaded. Type WipeOutFrameOff to run it.") (princ)