_

[LISP] CADPL - "Klonuj" blok [Tool]

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".

[LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kojacek » mar 18, 2012 22:58

Jak wczesniej zapowiadałem - program CloneBlock. To jest nieco surowa testowa wersja (na 100% nie jest zrobiona w całości wersja językowa (;LANG;).
Polecenie: CLB po wskazaniu dowolnego odniesienia do bloku (INSERT) tworzy jego kopię (nadając automatyczną nazwę). Mozna wskazać blok z nazwą (także dynamiczny), anonimowy (także dynamiczny). Bloki mogą mieć atrybuty (edytowalne). Ustawienie programu (w linii poleceń) pozwala na możliwość utworzenia (klonu) bloku zarówno z atrybutami jak i bez. Bloki dynamiczne tworzone są w oparciu o aktualny stan widoczności (skolonowany blok nie jest blokiem dynamicznym), czyli okresla tylko widoczną (w chwili wskazania) grafikę bloku. Wstawienia sklonowanego bloku oparte są o skalę X=Y=Z=1.0, i obrót=0.0 jego definicji a nie cechy wskazanego wstawienia. To samo dotyczy warstwy koloru rozdaju linii itp. Cechy te przyjmowane są z aktualych nastaw AutoCAD-a (CLAYER, CELTYPE itd.)

Oprócz obecnie omawianej:
Kod: Zaznacz cały
; jk:SYS_EntSelObj

trzeba przejrzejrzeć i przedyskutować poniższe funkcje biblioteczne:
Kod: Zaznacz cały
; jk:BLK_InsertTmp
; jk:BLK_IsDynamicInsert
; jk:BLK_GetDynamicProps
; jk:BLK_GetDynamicVisible
; jk:DCT_GetSubExtensionDict
; jk:DXF_mAssoc

Plik do pobrania:
CloneBlock.lsp
(13.02 KiB) Pobrane 167 razy

kojacek
Avatar użytkownika
kojacek
 
Posty: 5492
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kruuger » mar 18, 2012 23:14

ooo, jk:BLK_GetDynamicVisible niezle pojechane.

brak jk:CON_List->VariantArray.
k.
Avatar użytkownika
kruuger
 
Posty: 4850
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kojacek » mar 19, 2012 08:17

kruuger napisał(a):ooo, jk:BLK_GetDynamicVisible niezle pojechane.

brak jk:CON_List->VariantArray.
k.


Pardonsik... ;)
Kod: Zaznacz cały
(defun jk:CON_List->VariantArray (Lst DataType)
  (vlax-make-variant
    (vlax-safearray-fill
      (vlax-make-safearray DataType
        (cons 0 (1- (length Lst)))
      ) Lst
    )
  )
)

Także do omówienia dla biblioteki. Tera powinno chodzić... :)
kojacek
Avatar użytkownika
kojacek
 
Posty: 5492
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kruuger » mar 19, 2012 10:34

ja bym sie jaszcze zastanwil co dokladnie to ma robic. moze:
opcja 1 - klonuje blok 1:1 czyli wszystko jak leci
opcja 2 - klonuje dane visibilty jesli dynamiczny (razem z atrybutami) - blok bedzie juz zwykly, nie dynamiczny
opcja 3 - klonuje dane visibilty bez atrybutow (zwykly nie dynamiczny)
?
k.
Avatar użytkownika
kruuger
 
Posty: 4850
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kojacek » mar 19, 2012 10:42

kruuger napisał(a):ja bym sie jaszcze zastanwil co dokladnie to ma robic. moze:
opcja 1 - klonuje blok 1:1 czyli wszystko jak leci
opcja 2 - klonuje dane visibilty jesli dynamiczny (razem z atrybutami) - blok bedzie juz zwykly, nie dynamiczny
opcja 3 - klonuje dane visibilty bez atrybutow (zwykly nie dynamiczny)
?


To znaczy teraz robi tak:
1) Zawsze robi blok niedynamiczny (z niedynamicznego to zrozumiałe, a z dynamicznego - aktualny visibility (jeśli są) lub aktualny stan (stretch, mirror, etc)
2) Edytowalne atrybuty mogą być dodane, lub nie.

kojacek
Avatar użytkownika
kojacek
 
Posty: 5492
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kruuger » mar 19, 2012 10:52

kojacek napisał(a):
kruuger napisał(a):ja bym sie jaszcze zastanwil co dokladnie to ma robic. moze:
opcja 1 - klonuje blok 1:1 czyli wszystko jak leci
opcja 2 - klonuje dane visibilty jesli dynamiczny (razem z atrybutami) - blok bedzie juz zwykly, nie dynamiczny
opcja 3 - klonuje dane visibilty bez atrybutow (zwykly nie dynamiczny)
?


To znaczy teraz robi tak:
1) Zawsze robi blok niedynamiczny (z niedynamicznego to zrozumiałe, a z dynamicznego - aktualny visibility (jeśli są) lub aktualny stan (stretch, mirror, etc)
2) Edytowalne atrybuty mogą być dodane, lub nie.

kojacek

teraz jakby byla jeszcze opcja zrobienia klona 1:1 tylko pod inna nazwa.
inaczej trzeba kopiowac do innego rysunku, zmiany nazwy i wklej z powrotem
k.
Avatar użytkownika
kruuger
 
Posty: 4850
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kojacek » mar 19, 2012 10:57

kruuger napisał(a): teraz jakby byla jeszcze opcja zrobienia klona 1:1 tylko pod inna nazwa.
inaczej trzeba kopiowac do innego rysunku, zmiany nazwy i wklej z powrotem

Nie rozumiem, zawsze jest tworzony klon pod nową nazwą. Czy może mówisz o klonie dynamika ???
Z drugiej strony wrzuć jakiś rysunek z jakimiś wycudowanymi dynamikami - potrzebuję do testów, na tych moich chodzi, ale z pewnością nie mam całej palety możliwości dybamicznych.

kojacek
Avatar użytkownika
kojacek
 
Posty: 5492
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kruuger » mar 19, 2012 11:05

kojacek napisał(a):
kruuger napisał(a): teraz jakby byla jeszcze opcja zrobienia klona 1:1 tylko pod inna nazwa.
inaczej trzeba kopiowac do innego rysunku, zmiany nazwy i wklej z powrotem

Nie rozumiem, zawsze jest tworzony klon pod nową nazwą. Czy może mówisz o klonie dynamika ???
Z drugiej strony wrzuć jakiś rysunek z jakimiś wycudowanymi dynamikami - potrzebuję do testów, na tych moich chodzi, ale z pewnością nie mam całej palety możliwości dybamicznych.

kojacek

chodzi dokladnie o klon dynamika. ze wszystkim co jest w bloku, visibility itp.
jakichs cudakow raczej unikam, ale zobacz na te. troszke sie dzieje
.k
Załączniki
test.dwg
(55.14 KiB) Pobrane 109 razy
Avatar użytkownika
kruuger
 
Posty: 4850
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kojacek » mar 21, 2012 09:15

kruuger napisał(a): chodzi dokladnie o klon dynamika. ze wszystkim co jest w bloku, visibility itp.

No... to jest wyzwanie. Nieco kombinowałem, nie wiem czy efekty będą zadowalajace... chyba nie da się obejść ObjectDBX tutaj... Oprócz ponizszego kodu, musi być załadowany CADPL-Pack, oraz CloneBlock.lsp
Wywołanie: TESTBLO, następnie wyhaczyć blok dynamiczny.
Póki co to jest wersja robocza.

Kod: Zaznacz cały
; =========================================================================================== ;
(defun jk:DBX_Check-ObjectDBX (TVer / Id Dll Fl)
  (setq Fl (strcat "AxDb" TVer ".dll"))
  (if
    (not (setq Id (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument." Tver "\\CLSID"))))
    (progn
      (setq Dll (findfile Fl))
      (if Dll
   (progn
     (startapp "regsvr32.exe" (strcat "/s \"" (findfile Dll) "\""))
     T
   )
   (progn
     (alert (strcat "Nie mozna znaleźc pliku " Fl "."))
     Nil
   )
      )
    )
    T
  )
)
; =========================================================================================== ;
(defun jk:DBX_Get-ObjectDBX (Tver)
  (if
    (not *JK-ObjectDBX*)
    (if
      (jk:DBX_Check-ObjectDBX Tver)
      (setq *JK-ObjectDBX*
   (vla-getInterfaceObject
     (vlax-get-acad-object)
     (strcat "ObjectDBX.AxDbDocument." Tver)
   )
      )
      Nil
    )
    *JK-ObjectDBX*
  )
)
; =========================================================================================== ;
(defun C:testblo (/ si sx dv as fn nn bn bx *JK-ObjectDBX*)
  (if
    (setq si (car (entsel "\nBlok dyn: ")))
    (if
      (and
        (= (cdr (assoc 0 (entget si))) "INSERT")
        (jk:BLK_IsDynamicInsert (setq sx (vlax-ename->vla-object si)))
        (jk:DBX_Check-ObjectDBX
          (setq dv (substr (getvar "ACADVER") 1 2))
        )
      )
      (progn
        (setq as (jk:SSX_Add-SelectionSet "x"))
        (vla-additems as
          (jk:CON_List->VariantArray
            (list sx)
            vlax-vbObject
          )
        )
        (if
          (and
            (setq fn (vl-filename-mktemp "" nil ".dwg"))
            (not
              (cd:SYS_CheckError (list vla-WBlock (cd:ACX_ADoc) fn as))
            )
          )
          (if
            (jk:DBX_Get-ObjectDBX dv)
            (progn
              (setq bn (vla-get-effectivename sx)
                    nn (cd:STR_TableNameAuto "BLOCK" "CADPL_CB_" nil "0" 5)
              )
              (vla-open *JK-ObjectDBX* fn)
              (setq bx (vla-item (vla-get-blocks *JK-ObjectDBX*) bn))
              (vla-put-name bx nn)
              (vla-SaveAs *JK-ObjectDBX* (vla-get-Name *JK-ObjectDBX*))
              (vla-CopyObjects
                *JK-ObjectDBX*
                (jk:CON_List->VariantArray (list bx) vlax-vbObject)
                (cd:ACX_Blocks)
              )
              (vlax-release-object *JK-ObjectDBX*)
              (vl-file-delete fn)
            )
          )
        )
      )
    )
  )
  (if
    (tblobjname "BLOCK" nn)
    (jk:BLK_InsertTmp
      (list
        (strcat
          "\nOkreśl punkt wstawienia bloku "
          (strcase nn) ": "
        )
        ""
      )
      nn nil 0.0
    )
  )
)
; =========================================================================================== ;
(defun jk:SSX_Add-SelectionSet (Name / obs)
  (setq obs (vla-get-selectionsets (cd:ACX_ADoc)))
  (if
    (cd:SYS_CheckError (list vla-add obs Name))
    (vla-clear (vla-item obs Name))
  )
  (vla-item obs Name)
)
; =========================================================================================== ;

kojacek
Avatar użytkownika
kojacek
 
Posty: 5492
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - "Klonuj" blok [Tool]

Postprzez kruuger » mar 21, 2012 09:56

kojacek napisał(a):
kruuger napisał(a): chodzi dokladnie o klon dynamika. ze wszystkim co jest w bloku, visibility itp.

No... to jest wyzwanie. Nieco kombinowałem, nie wiem czy efekty będą zadowalajace... chyba nie da się obejść ObjectDBX tutaj... Oprócz ponizszego kodu, musi być załadowany CADPL-Pack, oraz CloneBlock.lsp
Wywołanie: TESTBLO, następnie wyhaczyć blok dynamiczny.
Póki co to jest wersja robocza.

Kod: Zaznacz cały
; =========================================================================================== ;
(defun jk:DBX_Check-ObjectDBX (TVer / Id Dll Fl)
  (setq Fl (strcat "AxDb" TVer ".dll"))
  (if
    (not (setq Id (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument." Tver "\\CLSID"))))
    (progn
      (setq Dll (findfile Fl))
      (if Dll
   (progn
     (startapp "regsvr32.exe" (strcat "/s \"" (findfile Dll) "\""))
     T
   )
   (progn
     (alert (strcat "Nie mozna znaleźc pliku " Fl "."))
     Nil
   )
      )
    )
    T
  )
)
; =========================================================================================== ;
(defun jk:DBX_Get-ObjectDBX (Tver)
  (if
    (not *JK-ObjectDBX*)
    (if
      (jk:DBX_Check-ObjectDBX Tver)
      (setq *JK-ObjectDBX*
   (vla-getInterfaceObject
     (vlax-get-acad-object)
     (strcat "ObjectDBX.AxDbDocument." Tver)
   )
      )
      Nil
    )
    *JK-ObjectDBX*
  )
)
; =========================================================================================== ;
(defun C:testblo (/ si sx dv as fn nn bn bx *JK-ObjectDBX*)
  (if
    (setq si (car (entsel "\nBlok dyn: ")))
    (if
      (and
        (= (cdr (assoc 0 (entget si))) "INSERT")
        (jk:BLK_IsDynamicInsert (setq sx (vlax-ename->vla-object si)))
        (jk:DBX_Check-ObjectDBX
          (setq dv (substr (getvar "ACADVER") 1 2))
        )
      )
      (progn
        (setq as (jk:SSX_Add-SelectionSet "x"))
        (vla-additems as
          (jk:CON_List->VariantArray
            (list sx)
            vlax-vbObject
          )
        )
        (if
          (and
            (setq fn (vl-filename-mktemp "" nil ".dwg"))
            (not
              (cd:SYS_CheckError (list vla-WBlock (cd:ACX_ADoc) fn as))
            )
          )
          (if
            (jk:DBX_Get-ObjectDBX dv)
            (progn
              (setq bn (vla-get-effectivename sx)
                    nn (cd:STR_TableNameAuto "BLOCK" "CADPL_CB_" nil "0" 5)
              )
              (vla-open *JK-ObjectDBX* fn)
              (setq bx (vla-item (vla-get-blocks *JK-ObjectDBX*) bn))
              (vla-put-name bx nn)
              (vla-SaveAs *JK-ObjectDBX* (vla-get-Name *JK-ObjectDBX*))
              (vla-CopyObjects
                *JK-ObjectDBX*
                (jk:CON_List->VariantArray (list bx) vlax-vbObject)
                (cd:ACX_Blocks)
              )
              (vlax-release-object *JK-ObjectDBX*)
              (vl-file-delete fn)
            )
          )
        )
      )
    )
  )
  (if
    (tblobjname "BLOCK" nn)
    (jk:BLK_InsertTmp
      (list
        (strcat
          "\nOkreśl punkt wstawienia bloku "
          (strcase nn) ": "
        )
        ""
      )
      nn nil 0.0
    )
  )
)
; =========================================================================================== ;
(defun jk:SSX_Add-SelectionSet (Name / obs)
  (setq obs (vla-get-selectionsets (cd:ACX_ADoc)))
  (if
    (cd:SYS_CheckError (list vla-add obs Name))
    (vla-clear (vla-item obs Name))
  )
  (vla-item obs Name)
)
; =========================================================================================== ;

kojacek

tak. w gre wchodzi tylko dbx. da sie to zrobic bez wblocka.
lecialo jakos tak:
Kod: Zaznacz cały
(setq dbx (GetObjectDBX))
(setq bls (cd:ACX_Blocks))
(setq dbxbls (vla-get-Blocks dbx))
(vla-CopyObjects (cd:ACX_ADoc) Variant (list bls)) dbxbls)
zmiana nazwy
(vla-CopyObjects dbx variant (list dbxbls)) bls)


przypomnialo mi sie to:
post7653339.html?hilit=refedit%20copy#p7653336
mozna by tez poprawic tego wblock i zrobic moze taka funkcje biblioteczna do klonowania definicji bloku

k.
Avatar użytkownika
kruuger
 
Posty: 4850
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Następna strona

Powrót do AutoCAD

Kto przegląda forum

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