_

Dynamiczne punkty w dictionary

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

Dynamiczne punkty w dictionary

Postprzez daniel5 » paź 16, 2020 16:49

Dzień dobry
W danych dodatkowych XDATA jest kod 1011 w którym zapisywany jest punkt współrzędnych. Jest on przesuwalny, skalowalny etc. Opisane jest to dobrze w tym poście
http://forum.cad.pl/wiczenie-lisp-xdata-extended-data-t74952-10.html
Problemem jest ograniczenie xdata co do ilości danych . Powyżej 500 punktów xdata nie przyjmie. Więc utworzyłem słownik i zapisałem xrecord punkty. Tylko że nie mogę zapisać punków z kodem 1011 bo wywalali błąd o nie prawidłowych danych
dxf. Natomiast jeśli zapiszę pod innym akceptowalnym kodem np. 10 lub 11 to punkty nie są przesuwalne. Przykład danych poniżej
Kod: Zaznacz cały
((10 1804.74 1647.41 0.0) (10 1704.74 1647.41 0.0) (10 1804.74 1627.41 0.0) (10 1704.74 1627.41 0.0) (10 1804.74 1607.41 0.0) (10 1704.74 1607.41 0.0) (10 1804.74 1587.41 0.0) (10 1704.74 1587.41 0.0) (10 1804.74 1567.41 0.0) (10 1704.74 1567.41 0.0))


Ma ktoś pomysł jak to obejść?
daniel5
 
Posty: 271
Dołączył(a): sty 31, 2008 15:39
Lokalizacja: Sochaczew

Re: Dynamiczne punkty w dictionary

Postprzez kojacek » paź 17, 2020 17:49

daniel5 napisał(a):Dzień dobry
W danych dodatkowych XDATA jest kod 1011 w którym zapisywany jest punkt współrzędnych. Jest on przesuwalny, skalowalny etc. Opisane jest to dobrze w tym poście
http://forum.cad.pl/wiczenie-lisp-xdata-extended-data-t74952-10.html
Problemem jest ograniczenie xdata co do ilości danych . Powyżej 500 punktów xdata nie przyjmie. Więc utworzyłem słownik i zapisałem xrecord punkty. Tylko że nie mogę zapisać punków z kodem 1011 bo wywalali błąd o nie prawidłowych danych
dxf. Natomiast jeśli zapiszę pod innym akceptowalnym kodem np. 10 lub 11 to punkty nie są przesuwalne. Przykład danych poniżej
Kod: Zaznacz cały
((10 1804.74 1647.41 0.0) (10 1704.74 1647.41 0.0) (10 1804.74 1627.41 0.0) (10 1704.74 1627.41 0.0) (10 1804.74 1607.41 0.0) (10 1704.74 1607.41 0.0) (10 1804.74 1587.41 0.0) (10 1704.74 1587.41 0.0) (10 1804.74 1567.41 0.0) (10 1704.74 1567.41 0.0))


Ma ktoś pomysł jak to obejść?


Obawiam się że w ten sposób nie da się tego zrobić. Słowniki (w tym Extension Dictionary obiektu) oraz XRECORD, są obiektami niegraficznymi. Stąd z natury swej nie podlegają przekształceniom typu skalowanie, przesunięcie, odbijanie lustrzane. Zatem XDATA do nich dodane, nie podlegają takim zmianom. Pytanie - do czego potrzebne jest Ci więcej niż 500 punktów w Xdata jednego obiektu? Bo jeśli te dane mają być później zawsze odczytywane przez aplikację, można taki machanizm uprościć. Na przykład tak:
- jest obiekt np. polinia. Ma przypisane dane xdata, Te xdata to np. 2-3 punkty (jakieś dwie / trzy bazy DXF 1011) + współczynnik skali (DXF 1042) + odleglość DXF 1041
- jednocześnie ma zapisany ExtensionDict, w nim jakiś własny słownik, a w nim jux XRECORD z danymi
- ponieważ XRECORD nie ma ograniczeń - może mieć zapisane np. 70 milionów (credit : sasin) punktów i inne dane (odleglości, kąty itp). Ważne tylko aby były w relacji do punktów bazowych w xdata.
Teraz - po skalowaniu / przesunięciu / obrocie / odbiciu obiektu automatycznej transformacji ulegają dane w xdata, (a te w XRECORD nie). Ale wystarczy je tylko pobrać i poddać przekształceniom takim jakim uległy dane xdata. Cały ten mechanizm - tutaj jako pomysł - można oczywiście mniej lub bardziej skomplikować, w zależności od potrzeb.
Avatar użytkownika
kojacek
 
Posty: 5528
Dołączył(a): paź 03, 2005 20:17

Re: Dynamiczne punkty w dictionary

Postprzez daniel5 » paź 18, 2020 19:39

Punkty zapisane w xdata wykorzystywane są do podglądu rozmieszczenia prętów. jest to taki przełącznik on/off.
W załączniku przykładowy zasięg, wczytaj kod poniżej i CADpack-a, zobaczysz jak to działa.
Kod: Zaznacz cały
(defun c:prety ( / xd i)
 (setq xd(cddr(cd:XDT_GetXData (car (entsel)) "DP_ZBR_PRETY")))
  (setq i 0)
  (if xd
   (repeat   (fix (/ (length xd) 2))
     (dp:linia (cdr (nth i xd))
          (cdr (nth (1+ i) xd))
          "0"
     )
     (setq i (+ i 2))
   )
      )
)
;;;=====================================================
(defun dp:linia   (ppocz pkon namelayer)
  (entmake (list (cons 0 "LINE")
       (cons 8 namelayer)
                 (cons 10 ppocz)
                 (cons 11 pkon)))
);;;defun

Zastosowanie kodu 1011 jest bardzo wygodne, można przesuwać, obracać i pręty się dopasowują. Nie trzeba tworzyć specjalnych poleceń. W rzadkich przypadkach liczba prętów jest zbyt duża.
My tu mamy pomysł żeby zapisywać dane nie w jednym obiekcie, a w kilku. Zasięg z załącznika będzie blokiem.
Twój pomysł jest ok, dużo opcji trzeba tu przewidzieć i przeliczyć:)
Załączniki
testy_prety.dwg
(50.55 KiB) Pobrane 9 razy
daniel5
 
Posty: 271
Dołączył(a): sty 31, 2008 15:39
Lokalizacja: Sochaczew

Re: Dynamiczne punkty w dictionary

Postprzez kruuger » paź 19, 2020 10:22

daniel5 napisał(a):Punkty zapisane w xdata wykorzystywane są do podglądu rozmieszczenia prętów. jest to taki przełącznik on/off.
W załączniku przykładowy zasięg, wczytaj kod poniżej i CADpack-a, zobaczysz jak to działa.
Kod: Zaznacz cały
(defun c:prety ( / xd i)
 (setq xd(cddr(cd:XDT_GetXData (car (entsel)) "DP_ZBR_PRETY")))
  (setq i 0)
  (if xd
   (repeat   (fix (/ (length xd) 2))
     (dp:linia (cdr (nth i xd))
          (cdr (nth (1+ i) xd))
          "0"
     )
     (setq i (+ i 2))
   )
      )
)
;;;=====================================================
(defun dp:linia   (ppocz pkon namelayer)
  (entmake (list (cons 0 "LINE")
       (cons 8 namelayer)
                 (cons 10 ppocz)
                 (cons 11 pkon)))
);;;defun

Zastosowanie kodu 1011 jest bardzo wygodne, można przesuwać, obracać i pręty się dopasowują. Nie trzeba tworzyć specjalnych poleceń. W rzadkich przypadkach liczba prętów jest zbyt duża.
My tu mamy pomysł żeby zapisywać dane nie w jednym obiekcie, a w kilku. Zasięg z załącznika będzie blokiem.
Twój pomysł jest ok, dużo opcji trzeba tu przewidzieć i przeliczyć:)

nie znam sie na pretach, ale nie lepiej wyliczyc w locie ich polozenie, zamiast gdzies tam zapisywac, skalowac, obracac itp ?
Avatar użytkownika
kruuger
 
Posty: 4886
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: Dynamiczne punkty w dictionary

Postprzez daniel5 » paź 19, 2020 11:30

Dołączony tu przykład to prosty przykład, prostokąt, a kształty mogą być bardziej skomplikowane.
Rozkład prętów tworzony jest na podstawie kreskowania które następnie jest rozbijane i przechwytywane są punkty początkowe i końcowe linii. Tworzenie tego w locie może być problematyczne choć pewnie nie jest nie możliwe.
daniel5
 
Posty: 271
Dołączył(a): sty 31, 2008 15:39
Lokalizacja: Sochaczew


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników