Rekomendowane odpowiedzi

Opublikowano

Racja, przeoczyłem to z dwuteownikami, oooops . plik skoryguję, nie wiedziałem, ze to narobi kupe problemów

 

attachicon.gifB3D-018.jpg

 

bedzie zasada jak na grafice

 

 

DWG z dwuteownikami pozamykanymi, zetowniki także, pręt to okrąg, rura kwadratowa to region

 

 

mam nadzieje ze bedzie juz ok attachicon.gifB3D-003.dwg

 

p.s. dyscyplina w CAD ważna , @kojacek - zrozumiałem, mam nadzieje że tak

Ale samo zamknięcie to połowa sukcesu. W tym przypadku "niehigieniczne" jest przecież także pokrywanie się pierwszego i ostatniego wierzchołka.

Z tymi regionami to fajna sprawa, można bedzie płyty kanałowe modelować w 3D dużo dużo łatwiej lub pustaki stropowe dowolne do stropów gestożebrowych ..... ciekawych rzeczy sie uczę ;)

Jeśli dobrze pamiętam regiony w AutoCAD-zie były dostępne chyba już w wersji 12 (z AME) czyli w ~ 1992 roku! :)

Opublikowano

Co do 1. Skorzystałem z biblioteki profili stalowych , w ten sposób wykonstruowanych - jedynie co moge to uzyc zamkniecia, ale t jak piszesz 1 i ostatni punkt sie pokrywa

 

co do 2. Nie korzystałem z tej opcji , dopiero dzis ją poznałem , wniosek jaki mi sie nasuwa, regiony z otworami są ok do tworzenia

brył solidowych, ale niestety nie nadają sie do polecenia SLAB w zwcad architecture.

 

 

p.s. dygresja dla architecturowców

 

Jesli chcemy miec np. komin 3D sparametryzowany z polecenia SLAB to winny byc osobne obszary zamkniete,

post-140-0-69810300-1445970959_thumb.jpg

 

w przypadku tworzenia bryły solidowej to nie ma znaczenia, region "z dziurami" duzo wygodniejszy

post-140-0-97532100-1445970997_thumb.jpg

Opublikowano (edytowane)

Kojacku załączam kilka bloków stworzonych w Zwcadzie do testowania. Bloki od "a1" do "a8" zawierają albo polilinie zamknięte albo regiony więc powinny się dać wyciągnąć. Bloki B nie nadają się do tego.

 

err. blok b2 zawiera niezamkniętą polilinię a udaje się go wyciągnąć ??

 

Wg moich testów - dwie listy: bloków wszystkich i dobrych czyli tych które akceptujemy (Polilinia zamknięta lub region). Jak widać B2 jest skutecznie odfiltrowany: 

 

post-451-0-27819700-1445971151.png

Co do 1. Skorzystałem z biblioteki profili stalowych , w ten sposób wykonstruowanych - jedynie co moge to uzyc zamkniecia, ale t jak piszesz 1 i ostatni punkt sie pokrywa

 

 

Przecież nie jest zabronione wykorzystanie LISP-a z funkcją (autoreklama): jk:LWP_CorrectStartEndPoint pokazaną na (autoreklama) https://kojacek.wordpress.com/polilinia-zamknieta/

Edytowane przez kojacek
Opublikowano (edytowane)

Kolejny etap do testowania... Jeśli chodzi powinien:

1) Rozpoznawać prawidłowe bloki

2) "Urozmaicić wybór", poprzez: podanie nazwy z ręki / wybranie z listy / wskazanie bloku

3) Zapamiętywać ostatnie ustawienia

4) No i polecenie ma skrócone - teraz jest B3D

 

Kod:

; =========================================================================================== ;
(load "CADPL-Pack-v1.lsp" -1)
; =========================================================================================== ;
(defun C:B3D ()(ExtrIns)(princ))
; =========================================================================================== ;
(defun ExtrIns (/ LBlk InsName StartP EndP PathEnt InsObj)
  (if
    (not (setq LBlk (BlockProfileList)))
    (princ "\nW rysunku nie zdefiniowano bloków dla profili. ")
    (progn
      (if (not *B3D-Settings*)(setq *B3D-Settings* (list (car LBlk) 1.0)))
      (if
        (setq StartP (getpoint "\nPierwszy punkt linii definiującej ścieżkę: "))
        (if
          (setq EndP (getpoint StartP "\nKoniec ścieżki: "))
          (if
            (setq InsName (GetBlockProfileName LBlk))
            (progn
              (cd:SYS_UndoBegin)
              (setq InsObj (cd:BLK_InsertBlock StartP InsName '(1 1 1) 0 T))
              (SetInsertZOrient
                (NewVect StartP EndP)
                (setq InsObj (vlax-vla-object->ename InsObj))
              )
              (setq PathEnt (cd:ENT_MakeLine (getvar "CTAB") StartP EndP T))
              (ExtrudeProfile (vlax-ename->vla-object InsObj) PathEnt)
              (cd:SYS_UndoEnd)
            )
          )
        )
      )
    )
  )
)
; =========================================================================================== ;
(defun GetBlockProfileName (LProf / f k s)
  (setq f (car *B3D-Settings*)
        s (car (mapcar '(lambda (%)(cd:STR_ReParse LProf %))(list " ")))
  )
  (initget (strcat "Lista Wybierz " s))
  (setq k
    (vl-catch-all-apply 'getkword
      (list (strcat "\nProfil [Lista/Wybierz] lub podaj nazwę <" f ">: "))
    )
  )
  (if
    (not k) f
    (if
      (= (type k) 'STR)
      (cond
        ( (= k "Lista")(ProfileDlg LProf))
        ( (= k "Wybierz")(SelectBlock LProf))
        (t k)
      )
    )
  )
)
; =========================================================================================== ;
(defun ProfileDlg (BlkL / r p)
  (setq r (cd:DCL_StdListDialog BlkL
    (vl-position (car *B3D-Settings*) BlkL)
    "Profile" "Wybierz:" 25 12 2 12 (list "&Ok" "&Anuluj")
    nil T T nil)
  )
  (if r (progn
    (setq p (nth r BlkL))
    (setq *B3D-Settings* (list p (cadr *B3D-Settings*))))
  ) p
)  
; =========================================================================================== ;
(defun SelectBlock (Lst / e d s)
  (if
    (and
      (setq e (entsel "\nWybierz blok: "))
      (setq d (entget (car e)))
      (= "INSERT" (cdr (assoc 0 d)))
      (member
        (strcase (setq s (cdr (assoc 2 d))))
        (mapcar 'strcase Lst)
      )
    )
    (progn
      (setq *B3D-Settings* (list s (cadr *B3D-Settings*))) s
    )
  )  
)
; =========================================================================================== ;
(defun ExtrudeProfile (Blk Lin / Prf Crv Reg Del)
  (vla-explode Blk)
  (setq Prf (entlast))
  (vla-delete Blk)
  (if
    (cond
      ( (= "LWPOLYLINE" (cdr (assoc 0 (entget Prf))))
        (setq Crv (vlax-make-safearray vlax-vbObject '(0 . 0)))
        (vlax-safearray-put-element Crv 0 (vlax-ename->vla-object Prf))
        (setq Reg (vla-AddRegion (cd:ACX_ASpace) Crv))
      )
      ( (= "REGION" (cdr (assoc 0 (entget Prf))))
        (setq Reg (vlax-ename->vla-object Prf))
      )
      (t nil)
    )
    (progn
      (vla-AddExtrudedSolidAlongPath
        (cd:ACX_ASpace)
        (if
          (= (type Reg )'VLA-OBJECT)
          Reg
          (setq Del (vlax-safearray-get-element (vlax-variant-value Reg) 0))
        )
        (vlax-ename->vla-object Lin)
      )
      (if Del (vla-delete Del))
      (foreach % (list Lin Prf)(entdel %))
    )
  )
)
; =========================================================================================== ;
(defun NewVect (p1 p2 / dt sq sm um uv)
  (setq dt (mapcar '- p2 p1)
        sq (mapcar '* dt dt)
        sm (apply '+ sq)
        um (sqrt sm)
        uv (mapcar '/ dt (list um um um))
  )
)
; =========================================================================================== ;
(defun SetInsertZOrient (ExtrVec Ename / e b)
  (setq e (entget Ename)
        b (trans (cdr (assoc 10 e)) Ename ExtrVec)
        e (subst (cons 10 b)(assoc 10 e) e)
        e (subst (cons 50 0.0)(assoc 50 e) e)
        e (subst (cons 210 ExtrVec)(assoc 210 e) e)
  )
  (entmod e)
)
; =========================================================================================== ;
(defun BlockProfile-p (Name / l d)
  (if
    (= 1 (length (setq l (cd:BLK_GetEntity Name nil))))
    (progn
      (setq d (entget (car l)))
      (or
        (and
          (= (cdr (assoc 0 d)) "LWPOLYLINE")
          (= 1 (logand 1 (cdr (assoc 70 d))))
        )
        (= (cdr (assoc 0 d)) "REGION")
      )    
    ) 
  )
)
; =========================================================================================== ;
(defun BlockProfileList (/ l)
  (if
    (setq l (cd:SYS_CollList "BLOCK" (+ 1 2 4 8)))
    (acad_strlsort (vl-remove-if-not '(lambda (%)(BlockProfile-p %)) l))
  )
)
; =========================================================================================== ;
(princ "\nZaładowano polecenie: B3D ")
(princ)
Edytowane przez kojacek
Opublikowano (edytowane)

Działa, szacun :hi:

 

 

Mam pytanie o polskie znaki, Chińczycy wprowadzili do ZWCAD UTF-8, a ale w lispie trzeba zawartość zapisac jako ANSI, o tym ostatnio gruzin pisał, znaki polskie

już mi działają. Używam angielskojezycznej wersji ZWCAD ARCHITECTURE - na silniku ZWCAD+ 2015 SP3.1 - z przyzwyczajenia.  To pytanie to taka odskocznia od problematyki.

 

W następnym kroku zajmę sie matematyczną stroną polecenia F3D do modelowania zakończeń bryły (typu: 0,1,2) po wykonaniu polecenia B3D ... ogarnę to by było łatwiej ;)

Edytowane przez Martin_S
Opublikowano (edytowane)

W takim razie, powinna iść konsekwencja i korekta tego UTF-8 w wersji ZWCAD2017 chyba, by działało to w lispach

 

Niesamowite, modelowanie na bryłach solidowych dawno nie było tak "przyjemne" jak teraz, kilka wieczorów wystarczyło.

Ale po co to 3D, to ma na celu dokładne spasowanie elementów w realnym modelu 3D, a z nich powstaną rysunki robocze 2D, to spore ułatwienie

jeśli nie korzysta się z profesjonalnych "kombajnów CAD". Taki sobe komentarz. Dobra robota @kojacek.

Edytowane przez Martin_S
Opublikowano

Nie o LUW, z LUW-em nie ma problemu - tu się wstawi zabezpieczenie że ma być w globalnym i jest po krzyku. Chodzi o nazwy bloków zawierające podkreślnik lub spację. Aby można było wybrać blok z "wolnej ręki", lista bloków przekazywana jest do initget. To zaś powoduje że nazwy są "rozrywane" (podkreślnik służy do lokalizowania nazw, spacej to separatory).  Są dwa rozwiązania:

1) Rezygnacja z wpisywania ręcznego (jest wybierz, i wybór z listy, oraz enter jako ostatni)

2) Dodanie słowa kluczowego do wpisu czyli zgłoszenie typu:

Profil [Lista/Wybierz/Nazwa]<IPE500>:

czyli Lista - wiadomo, Wybierz - wiadomo, i trzeba dodatkowo Nazwa, aby podać nazwę bloku (tu już bez initgeta, tylko zakres listy), enter - wiadomo

To jest dodatkowe wydłużenie operacji

Opublikowano

Ja też myślę, że wpisywanie "z rączki" przy innych możliwościach będzie mało popularne.

Jeśli można wybrać to lepiej wybrać, ale według mnie wpisanie może być przydatne w jednym przypadku - jeśli w rysunku jest sporo bloków.

Nie wiem czy to możliwe (pewnie nie), ale może zamiast wpisywania nazwy bloku dodać filtr, który w oknie wyboru wyświetlałby tylko bloki, które w nazwie mają wpisane znaki.

 

Ale namotałem.

Opublikowano

Dla mnie jako użytkownika wystarczy napisać, zakaz używania w nazwie podkreślnika i spacji i po problemie, krótka piłka, a tak jak jest działa super, po prostu nie bede uzywał spacji ani podkreslnika :)

 

Super jest ta lista i opcja wybierz, szacun :hi:

Opublikowano (edytowane)

Dla mnie jako użytkownika wystarczy napisać, zakaz używania w nazwie podkreślnika i spacji i po problemie, krótka piłka, a tak jak jest działa super, po prostu nie bede uzywał spacji ani podkreslnika :)

 

Super jest ta lista i opcja wybierz, szacun :hi:

 

To już lepiej nie brać do listy takich bloków, ale... mam mieszane uczucia czy to dobry sposób. Nakładanie zbyt dużo ograniczeń, też nie jest dobrą drogą. Na razie myślę zrobię z tą Nazwą jako słowo kluczowe, i zobaczymy jak to działa.

Edytowane przez kojacek
Opublikowano

Kolejne wcielenie do testowania. Zmiany są takie:.

1) Na samym początku można ustawić skalę wstawianego bloku (w konsekwencji profilu). Zakres od 0,001 do 100, ustawiane w oknie.

2) Słowo kluczowe Nazwa do wpisania z ręki nazwy bloku.

3) Poprawki różne

 

Kod:

; =========================================================================================== ;
(if (not cd:ACX_ADoc)(load "CADPL-Pack-v1.lsp" -1))
; =========================================================================================== ;
(defun C:B3D ()(b3d:ExtrIns)(princ))
; =========================================================================================== ;
; ExtrudeProfile.lsp by kojacek 2015 / 
; =========================================================================================== ;
(defun b3d:ExtrIns (/ l n s e p o x)
  (if
    (not (setq l (b3d:BlockProfileList)))
    (princ "\nW rysunku nie zdefiniowano bloków dla profili. ")
    (progn
      (if (not *B3D-Settings*)(setq *B3D-Settings* (list (car l) 1.0)))
      (if
        (setq s (vl-catch-all-apply 'b3d:GetPointProfile (list nil)))
        (if
          (and
            (listp s)
            (setq e (vl-catch-all-apply 'b3d:GetPointProfile (list s)))
          )
          (if
            (listp e)
            (if
              (and
                (setq n (vl-catch-all-apply 'b3d:GetBlockProfileName (list l)))
                (= (type n) 'STR)
              )
              (progn
                (setq x (cadr *B3D-Settings*))
                (cd:SYS_UndoBegin)
                (setq o (cd:BLK_InsertBlock s n (list x x x) 0 T))
                (b3d:SetInsertZOrient
                  (b3d:NewVect s e)
                  (setq o (vlax-vla-object->ename o))
                )
                (setq p (cd:ENT_MakeLine (getvar "CTAB") s e T))
                (b3d:ExtrudeProfile (vlax-ename->vla-object o) p)
                (cd:SYS_UndoEnd)
              )
            )
          )
        )
      )
    )
  )
)
; =========================================================================================== ;
(defun b3d:GetBlockProfileName (LProf / f k s)
  (setq f (car *B3D-Settings*)
        s (car (mapcar '(lambda (%)(cd:STR_ReParse LProf %))(list " ")))
  )
  (initget (strcat "Lista Wybierz Nazwa"))
  (setq k
    (vl-catch-all-apply 'getkword
      (list (strcat "\nProfil [Lista/Wybierz/Nazwa] lub podaj nazwę <" f ">: "))
    )
  )
  (if
    (not k) f
    (if
      (= (type k) 'STR)
      (cond
        ( (= k "Lista")(b3d:ProfileDlg LProf))
        ( (= k "Wybierz")(b3d:SelectBlock LProf))
        ( (= k "Nazwa")(b3d:SelectName LProf))
        (t k)
      )
    )
  )
)
; =========================================================================================== ;
(defun b3d:SetGlobal (Mode Val)
  (if
    (zerop Mode)
    (setq *B3D-Settings* (list Val (cadr *B3D-Settings*)))
    (setq *B3D-Settings* (list (car *B3D-Settings*) Val))
  )
)
; =========================================================================================== ;
(defun b3d:SelectName (Lst / r)
  (if
    (and
      (setq r (getstring "\nNazwa: "))
      (member (strcase r)(mapcar 'strcase Lst))
    )
    (progn (b3d:SetGlobal 0 r) r)
    (b3d:GetBlockProfileName Lst)
  )
)
; =========================================================================================== ;
(defun b3d:ProfileDlg (BlkL / r p)
  (setq r (cd:DCL_StdListDialog BlkL
    (vl-position (car *B3D-Settings*) BlkL)
    "Profile" "Wybierz:" 25 12 2 12 (list "&Ok" "&Anuluj")
    nil T T nil)
  )
  (if r (progn (setq p (nth r BlkL))(b3d:SetGlobal 0 p)))
  p
)  
; =========================================================================================== ;
(defun b3d:SelectBlock (Lst / e d s)
  (if
    (and
      (setq e (entsel "\nWybierz blok: "))
      (setq d (entget (car e)))
      (= "INSERT" (cdr (assoc 0 d)))
      (member
        (strcase (setq s (cdr (assoc 2 d))))
        (mapcar 'strcase Lst)
      )
    )
    (progn (b3d:SetGlobal 0 s) s)
    (b3d:GetBlockProfileName Lst)
  )  
)
; =========================================================================================== ;
(defun b3d:ExtrudeProfile (Blk Lin / p c r d)
  (vla-explode Blk)
  (setq p (entlast))
  (vla-delete Blk)
  (if
    (cond
      ( (= "LWPOLYLINE" (cdr (assoc 0 (entget p))))
        (setq c (vlax-make-safearray vlax-vbObject '(0 . 0)))
        (vlax-safearray-put-element c 0 (vlax-ename->vla-object p))
        (setq r (vla-AddRegion (cd:ACX_ASpace) c))
      )
      ( (= "REGION" (cdr (assoc 0 (entget p))))
        (setq r (vlax-ename->vla-object p))
      )
      (t nil)
    )
    (progn
      (vla-AddExtrudedSolidAlongPath
        (cd:ACX_ASpace)
        (if
          (= (type r)'VLA-OBJECT)
          r
          (setq d (vlax-safearray-get-element (vlax-variant-value r) 0))
        )
        (vlax-ename->vla-object Lin)
      )
      (if d (vla-delete d))
      (foreach % (list Lin p)(entdel %))
    )
  )
)
; =========================================================================================== ;
(defun b3d:NewVect (p1 p2 / d q s m v)
  (setq d (mapcar '- p2 p1)
        q (mapcar '* d d)
        s (apply '+ q)
        m (sqrt s)
        v (mapcar '/ d (list m m m))
  )
)
; =========================================================================================== ;
(defun b3d:SetInsertZOrient (ExtrVec Ename / e b)
  (setq e (entget Ename)
        b (trans (cdr (assoc 10 e)) Ename ExtrVec)
        e (subst (cons 10 b)(assoc 10 e) e)
        e (subst (cons 50 0.0)(assoc 50 e) e)
        e (subst (cons 210 ExtrVec)(assoc 210 e) e)
  )
  (entmod e)
)
; =========================================================================================== ;
(defun b3d:BlockProfile-p (Name / l d)
  (if
    (= 1 (length (setq l (cd:BLK_GetEntity Name nil))))
    (progn
      (setq d (entget (car l)))
      (or
        (and
          (= (cdr (assoc 0 d)) "LWPOLYLINE")
          (= 1 (logand 1 (cdr (assoc 70 d))))
        )
        (= (cdr (assoc 0 d)) "REGION")
      )    
    ) 
  )
)
; =========================================================================================== ;
(defun b3d:BlockProfileList (/ l)
  (if
    (setq l (cd:SYS_CollList "BLOCK" (+ 1 2 4 8)))
    (acad_strlsort (vl-remove-if-not '(lambda (%)(b3d:BlockProfile-p %)) l))
  )
)
; =========================================================================================== ;
(defun b3d:GetPointProfile (Pt / m r)
  (setq r
    (if Pt
      (progn
        (initget 1)
        (getpoint Pt "\nKoniec ścieżki: ")
      )
      (progn
        (setq m
          (strcat
            "\nProfil (" (car *B3D-Settings*) " skala="
            (cd:CON_Real2Str (cadr *B3D-Settings*) 2 (getvar "LUPREC"))
            ") [Skala] lub wskaż pierwszy punkt ścieżki: "
          )
        )
        (initget 1 "Skala")
        (getpoint m)
      )
    )
  )
  (if (= r "Skala")(b3d:SetProfileScale) r)
)
; =========================================================================================== ;
(defun b3d:SetProfileScale ( / f l r)
  (setq f (cadr *B3D-Settings*)
        l (getvar "LUPREC")
  )
  (if
    (setq r
      (cd:DCL_StdEditBoxDialog
        (list 3
          (list
            (cons 1 "Wprowadź liczbę rzeczywistą")
            (cons 2 "Liczba nie może być zerem")
            (cons 8 "Spacje są niedozwolone")
            (cons 16 "To nie jest liczba")
            (cons 32 "Liczba jest za mała")
            (cons 64 "Liczba jest za duża")
          )
          (cd:CON_Real2Str f 2 l) 0.001 100 2 l
        )
        "Skala" "Wartość: " 25 12 (list "&OK" "&Anuluj") T nil
      )
    )
    (b3d:SetGlobal 1 (read r))
  )
  (b3d:GetPointProfile nil)
)
; =========================================================================================== ;
(princ "\nZaładowano polecenie: B3D ")
(princ)

Testujcie!

Opublikowano

tak sobie myślę: czemu podajemy dwa punkty do wyciągania kształtu. Dlaczego nie dodać opcji typu "wskaż polilinię" i wyciągnąć blok po polilinii. Można by było wyciągnąć od razu rurę po jej osi i uzyskać od razu gotową bryłę rurociągu. To raczej mała zmiana w kodzie ale bardzo duże ułatwienie podczas rysowania.

Opublikowano

Opcja z dwoma punktami jest najprostsza. Wydaje się że też najbardziej naturalna (mam jakieś przeczucie, że w wymyślny sposób gięte profile, w konstrukcjach występują z mniejszą intensywnością, niźli proste). Wyciąganie po wskazanej ścieżce jest też jak najbardziej możliwe. Problemem z jakim się pewnie zetkniemy, a które będzie trudno rozwiązać (albo rozwiązać w sposób stosunkowo rozbudowany) będą:

1) Bryła będzie jedna dla całej ścieżki. Zwykle oczekiwalibyśmy dopasowanych do siebie ale jednak kilka brył.

2) Zbyt małe kąty, czy promienie zaokrągleń, potrzebne do prawidłowego wyciągnięcia (zbyt dużego) profilu.Tego nie będzie można prawdopodobnie kontrolować przed wykonaniem operacji.

3) Ustawienie orientacji profili w początku ścieżki. O ile dla profilu będącym rurą okrągłą, nie ma to szczególnie znaczenia, dla innych może mieć (np. ścieżka oparta na polilinii 2d jest w istocie dwuwymiarowa. Pytanie - czy określamy każdorazowo w jaki sposób względem płaszczyzny na której leży ścieżka ustawiamy np. dwuteownik? Półka równolegle? prostopadle? Inaczej? Dla polilini 3d jest podobnie.

 

Oczywiście coś tam potestujemy, zobaczymy jak to wygląda. 

Opublikowano

Najtrudniejsze zagadnieenie to osadzanie bloku prostopadle na początku ścieżki, na prostej ścieżce to "mały pikuś" , gorzej gdy początkiem ścieżki jest łuk, na płaszczyźnie globalnej XY taką sciezke idzie ogarnąć poprzez znalezieniie stycznej na łuku co pomaga w osadzeniu bloku prostopadle do ściezki, gdy łuk jest w przestrzeni XYZ to chyba jest masakra, ale chyba wiem jak to matematycznie obejść.

 

Najlepiej by ścieżka cała (jednolita linia pomieszana z łukami lub bez, nalezała do 1 płaszczyzny. wtedy nie ma problemu ze sprowadzeniem za pomocą 2 wyliczonych obrotów wzgledem osi X i Y aby sprowadzic scieżkę do płaszczyzny globalnej XY, na niej w 2D duzo łatwiej "szuka" się stycznej, potem powrót ze styczną wykonując poprzednie obroty względem Y i X ścieżka wraca na własciwą pozycję w 3D ze styczną, wtedy osadzenie bloku na poczatku łuku i ściezki wykorzystujac zaczepioną styczną jest juz proste. Pisze to , bo na "piechotę" jestem wstanie to wyrzeźbić. ale to nie ten wątek.

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