kruszynski

Moderatorzy
  • Postów

    1474
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    93

Treść opublikowana przez kruszynski

  1. W załączniku poprawka która nadpisuje właściwości. ImportWlasciwosci.zel
  2. Mogę przygotować takiego LISPa, ale proszę na początek o odpowiedzi na kilka pytań: Automatyczną numerację atrybutów można różnie zrozumieć. np czy kolejne atrybuty w tym samym bloku maja mieć kolejne numery? czy jeden atrybut w różnych blokach ma mieć kolejne numery? Treść która była wcześniej ma się nadpisywać? czy numer ma się dopisywać przed/po aktualnej treści? Jak chciałby Pan używać funkcji? czy chce Pan wybierać bloki ? czy mają się same wybierać np po nazwie / warstwie / dotychczasowej treści któregoś z atrybutów? Może udostępniłby Pan jakiś mały przykład pliku, w którym moglibyśmy zobaczyć jak będzie wyglądał rysunek przed i jak jak powinien wyglądać rysunek po użyciu funkcji.
  3. Pliki fas, to LISP skompilowany w AutoCADzie. Proszę skontaktować się z autorem nakładki. Dysponując kodem źródłowym twórca może zaszyfrować plik w ZWCADzie do formatu zel, który będzie mógł Pan wczytać.
  4. OK, dodam taką możliwość
  5. chciałem podejrzeć wartość tej właściwości na działającym ZWCADzie. (setq display (vla-get-display (vla-get-preferences (vlax-get-acad-object)))) ( vlax-dump-object display t ) zobaczyłem że nil i (RO) czyli ReadOnly. więc zapytałem ZWSOFT jak można to ogarnąć Dam znać co odpowiedzą.
  6. tak na szybko to dlatego, że IZcadPreferencesDisplay nie ma jeszcze właściwości GraphicsWinModelBackgrndColor postaram się ustalić jak można to rozwiązać
  7. ok, w przyszłości dodam możliwość pomiaru względem aktualnego UCS.
  8. A mógłby Pan napisać coś więcej o tym co rozumieć jako "nie działa" ?
  9. Nie znam sposobu żeby ustawić w ZWCAD wzory kreskowania w innym katalogu.
  10. Załączam jeszcze pliki wzorów Hex.pat SOIL.pat
  11. Wzoru kreskowania HEX nie ma w pliku ZWCAD.pat w w ZWCAD 2017. Utworzyłem pliki soil.pat i hex.pat w katalogu: c:\Users\xxx\AppData\Roaming\ZWSoft\ZWCAD\2017\en-US\Support\ To wystarczyło, żeby wzory stały się w dostępne ZWCAD 2017.
  12. to może tak: (defun c:zz () (setq sciezka(car(entsel "\nWskaż ścieżkę wyciągania \n"))) (print "\nWskaż wszystkie powierzchnie") (setq pow3D (ssget)) (command "_Extrude" pow3d "" "_P" sciezka "" ) )
  13. Jeszcze czegoś nie rozumiem, Kiedy czytałem to pierwszy raz pomyślałem o wyciąganiu w sensie zamiany np prostokąta na prostopadłościan. Jeśli tak, to to się robi funkcją _sweep a nie _extrude. W takim przypadku cały kod mógłby wyglądać tak: (defun c:zz () (setq sciezka(car(entsel "\nWskaż ścieżkę wyciągania \n"))) (print "\nWskaż wszystkie powierzchnie") (setq pow3D (ssget)) (setq i 0) (while (< i (sslength pow3D)) (setq JednaPow (ssname pow3D i )) (command "_sweep" JednaPow "" sciezka ) (setq i (1+ i) ) ) ) Chyba że chodzi o wyciąganie pojedynczej powierzchni w bryle (_extrude) ale to już ciut bardziej skomplikowane /
  14. A jakiś komunikat błędu jest? czy jak nie działa Bardziej dziwi mnie że działa na powierzchni 3d niż że nie działa. To jest zupełnie niepotrzebne: (setq wszystkie nil ) (setq wszystkie (append wszystkie (list (cdr JednaPow)))) Jedną powierzchnię ze Zbioru selectionset wybiera się tak: (ssname pow3D i) gdzie i to kolejny index. kod: (setq JednaPow (assoc 10 pow3D)) Wyświetla mi komunikat: Error: incorrect type - <Selection Set: ffd188c0> I w sumie racja bo assoc wybiera z listy element powiązany z liczbą 10. a nie 10 czy 11 element z listy.
  15. (setq wierzchołek (assoc 10 polilinia)) to współrzędne w formacie (10 x y z) A Ty chcesz odczytywać współrzędne z listy wszystkich współrzędnych, a nie z listy współrzędnych jednego wierzchołka (setq x2 (nth 0 wierzchołki) y2 (nth 1 wierzchołki)) Powinno być: (setq wierzchołek (cdr wierzchołek )) (setq x2 (nth 0 wierzchołek) ) (setq y2 (nth 1 wierzchołek) ) Czyli całość: (defun c:yy () (setvar "dimzin" 2) (setq PozOdn (getreal "\nPodaj poziom odniesienia \n")) (setq P1 (getpoint "\nWskaz początek ukladu wspolrzednych \n")) (setq x1 (nth 0 P1) y1 (nth 1 P1)) (setq polilinia(entget (car(entsel "\nWskaż polilinię \n")))) (setq wierzchołki nil ) (while (setq wierzchołek (assoc 10 polilinia)) (setq wierzchołki (append wierzchołki (list (cdr wierzchołek)))) (setq polilinia (cdr (member wierzchołek polilinia) ) ) (setq wierzchołek (cdr wierzchołek )) (setq x2 (nth 0 wierzchołek) ) (setq y2 (nth 1 wierzchołek) ) (setq rzedna (+ PozOdn (/ (- y2 y1) 5))) (command "_text" wierzchołek "" "" (RTOS rzedna 2 2)) ) );KONIEC
  16. Obie funkcje Obrót3d i Lustro3d powinny być dostępne w wersji kolejnej aktualizacji.
  17. Dziękuję za zgłoszenie przekazałem do ZWSOFT
  18. W najbliższej wersji jeszcze nie będzie to obsługiwane, ale widać że coś przy tym majstrują.
  19. jeszcze taki bonus: Jeśli ma Pan problem typu: może Pan sprawdzić poszczególne paramtery i ich wartości : (entget(car(entsel)))
  20. Poszczególne kody DXF może Pan znaleźć np tutaj: http://www.autodesk.com/techpubs/autocad/acad2000/dxf/ Błędna wartość w linii: (setq sel1 (ssget "X" (list (cons 0 TEXT)(cons 1 stary_napis)(cons 8 warstwa))))) to TEXT. Użyte w ten sposób znaczy że TEXT to zmienna. Powinno być "TEXT" (setq nazwa_napisu (ssname napis 1)) ; Informole liczą od 0 a nie od 1. prosze uważać. podmiana wartości tekstu powinna wyglądać tak: (setq nowy_napis2 (subst (cons 1 nowy_napis) (assoc 1 zmiana) zmiana))
  21. W ciągu kilku najbliższych dni postaram się przygotować taki program.
  22. może to dlatego, że są dwie pętle (repeat ) W pierwszej przypisywana jest kolejno wartość do zmiennej lista_dxf. Druga pętla przechodzi tyle samo razy przez zmienną, której wartość nie jest nigdzie aktualizowana.
  23. Ja też się dziwiłem kiedy pierwszy raz się z tym spotkałem ;)
  24. Ogólnie dobrze, ale trochę chaos zaczyna się wkradać. (setq nazwa (sslength zb1) i 0) Może przemawia przeze mnie obsesja ale bardzo ważne jest nadawanie zmiennym odpowiednich nazw . Nazwy mają być znaczące a nie mylące. Bardzo dobrze jest to wytłumaczone w książce "Czysty kod. Podręcznik dobrego programisty" Autor: Robert C. Martin . Cały niewielki rozdział jest temu poświęcony. sslength zwraca ilość i nazywanie tego "nazwa" to zły pomysł warto też stosować zmienne lokalne. np (defun C:raport ( / nazwa_warstwy zb1 nazwa i ) W wielu miejscach w programie może pojawić się zmienna "i", jeśli mamy funkcję wewnątrz funkcji, w obu wykorzystujemy i jako licznik pętli to funkcja wewnętrzna nadpisze stan zmiennej z funkcji zewnętrznej i takiego błędu można szukać godzinami. (setq wsk (ssname zb1 i) lista_dxf (entget wsk)) Moim zdaniem bardziej czytelne byłoby (setq lista_dxf (entget (ssname zb1 i))) (princ "\n") (princ "Liczba elementow w zbiorze wyboru: ") (princ (sslength zb1)) (princ "\n") można uprościć do: (princ (strcat "\nLiczba elementow w zbiorze wyboru: " (itoa (sslength zb1) ) "\n" ) Teraz najważniejsze : (setq lista_dxf (entget (ssname zb1 i))) tutaj mamy zapisany cały element. (setq EntName (cdr (assoc 0 lista_dxf ) ) ) daje nam nazwę elementu np INSERT Trzeba wykorzystać cond i rozdzielić działanie programu na odpowiednie dla każdego typu obiektów. (cond ((= EntName "INSERT") (progn (print "blok") (print (cdr (assoc 2 lista_dxf ) ) ) ; nazwa bloku )) ((or(= EntName "LIGHTWEIGHTPOLYLINE")(= EntName "POLYLINE")) (progn (print "polilinia ") )) ((= EntName "CIRCLE")(progn (print "okrąg") ) ) ((= EntName "ARC") (progn (print "łuk") )) ((= EntName "LINE") (progn (print "linia") )) (t (print "Wybrałeś coś innego") ) ) odczytanie poszczególnych parametrów typu punkty początku, końca, środek itp to tylko kwestia odczytania odpowiedniej pozycji z list_dxf. (punkty to najczęściej kod: 10) pełną listę kodów można bez problemu znaleźć w Internecie. Można też zamienić element jako ENAME na VLA-OBJECT (setq element (vlax-ename->vla-object (ssname zb1 i) )) Wtedy to już pełna kultura obiektowości. Nazwę bloku możemy pobrać tak: (vlax-get-property element 'Name ) środek okręgu: (vlax-get-property element 'Center ) albo nawet tak: (vla-get-Center element ) tylko trzeba pamiętać, że punkty są typu variant, czyli trzeba je zamienić na czytelną postać zanim się je wyświetli: (vlax-safearray->list (vlax-variant-value (vlax-get-property element 'Center ) ) ) Powodzenia. W razie dalszych trudności proszę pisać