_

Wspórzędne rastra za pomocą VBA

Forum ogólne. Miejsce na pierwsze pytania w karierze projektanta. Wszelkie tematy, których nie można zakwalifikować do jednej z poniższych grup.

Wspórzędne rastra za pomocą VBA

Postprzez ahzak » mar 28, 2019 19:39

Witajcie, czy istnieje sposób przepisania do Excela pozycji (XYZ) obiektu AcDbRasterImage za pomocą makra VBA ?
ahzak
 
Posty: 3
Dołączył(a): mar 28, 2019 15:29

Re: Wspórzędne rastra za pomocą VBA

Postprzez ziele_o2k » kwi 01, 2019 11:30

Pytanie tak napisane, że nie wiadomo o co chodzi...
Opisz krok po kroku co masz i co chcesz mieć.
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 779
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: Wspórzędne rastra za pomocą VBA

Postprzez ahzak » kwi 04, 2019 16:50

Dla lepszego zrozumienia o co mi chodzi podaję link
https://knowledge.autodesk.com/de/searc ... 1-htm.html
makra, które z poziomu Excela wstawia obrazek rastrowy (plik jpg) do rysunku ACAD. Podaje się ścieżkę do tego pliku, pozycję xyz jego położenia skalę i obrót. Makro uruchomione w Excelu taki obrazek przypina do ACAD-a.
A ja szukam makra działającego w odwrotnie, to znaczy chcę wskazać obiekt typu raster w ACAD-zie a makro powinno przepisać do Excela przynajmniej pozycję tego obiektu.
Czy to się da zrobić za pomocą makr VBA?
ahzak
 
Posty: 3
Dołączył(a): mar 28, 2019 15:29

Re: Wspórzędne rastra za pomocą VBA

Postprzez ziele_o2k » kwi 04, 2019 21:46

ahzak napisał(a):Dla lepszego zrozumienia o co mi chodzi podaję link
https://knowledge.autodesk.com/de/searc ... 1-htm.html
makra, które z poziomu Excela wstawia obrazek rastrowy (plik jpg) do rysunku ACAD. Podaje się ścieżkę do tego pliku, pozycję xyz jego położenia skalę i obrót. Makro uruchomione w Excelu taki obrazek przypina do ACAD-a.
A ja szukam makra działającego w odwrotnie, to znaczy chcę wskazać obiekt typu raster w ACAD-zie a makro powinno przepisać do Excela przynajmniej pozycję tego obiektu.
Czy to się da zrobić za pomocą makr VBA?

Sterowaniem Cadem z poziomu Excela się nie zajmowałem, ale jest to do zrobienia. Na twoje potrzeby proponuję trochę inne rozwiązanie.
Sposób działania:
    Zakładam, że masz w cadzie jakieś obrazki oraz wczytaną poniższą funkcję
  1. Odpalasz funkcję ExportRasterDataToExcel
  2. zaznaczasz obrazki
  3. nadajesz nazwę nowemu plikowi xlsx
  4. koniec

Kod: Zaznacz cały
(defun c:ExportRasterDataToExcel
    (   
        /
        ;-------------;
        ; subroutines ;
        ;-------------;
        LM:ReleaseObject
       
        ;--------------------;
        ; function variables ;
        ;--------------------;
        ss
        xlApp
        xlCells
        data_list
        row
        header
        col
        xlActWbk
    )
    ;------------------------;
    ; subroutines definition ;
    ;------------------------;
    (defun LM:ReleaseObject ( obj )
        (and obj (eq 'VLA-OBJECT (type obj)) (not (vlax-object-released-p obj))
            (not
                (vl-catch-all-error-p
                    (vl-catch-all-apply 'vlax-release-object (list obj))
                )
            )
        )
    )
    ;---------------------;
    ; function definition ;
    ;---------------------;
    (if (setq ss (ssget (list (cons 0 "IMAGE"))))
        (progn
            (setq
                xlApp (vlax-get-or-create-object "Excel.Application")
                xlCells
                (vlax-get-property
                    (vlax-get-property
                        (vlax-get-property
                            (vlax-invoke-method
                                (vlax-get-property xlApp "Workbooks")
                                "Add"
                            )
                            "Sheets"
                        )
                        "Item" 1
                    )
                    "Cells"
                )
            )
            (setq data_list
                (mapcar
                    '(lambda (%img / ins_pt)
                        (setq ins_pt
                            (vlax-SafeArray->List
                                (vlax-Variant-Value
                                    (vlax-get-property %img "Origin")
                                )
                            )
                        )
                        (list
                            (car ins_pt)
                            (cadr ins_pt)
                            (caddr ins_pt)
                            (vlax-get-property %img "ScaleFactor")
                            (vlax-get-property %img "Rotation")
                            (findfile (vlax-get-property %img "ImageFile"))
                        )
                    )
                    (cd:SSX_Convert ss 1)
                )
            )
            (setq row 1)
            (setq header (list "X" "Y" "Z" "ScaleFactor" "Rotation" "ImageFile"))
            (foreach $row (cons header data_list)
                (setq col 1)
                (foreach $col $row
                    (vlax-put-property xlCells 'Item row col $col)
                    (setq col (1+ col))
                )
                (setq row (1+ row))
            )
            (setq xlActWbk (vlax-get-property xlApp "ActiveWorkbook"))
            (if (setq fn (getfiled "Create Output File" (getvar 'dwgprefix) "xlsx" 1))
                (progn
                    (vlax-invoke-method xlActWbk "SaveAs" fn 51 "" "" :vlax-false :vlax-false nil)
                    (vla-put-visible xlApp :vlax-true)
                )
            )
            (LM:ReleaseObject xlActWbk)
            (LM:ReleaseObject xlApp)
            (LM:ReleaseObject xlCells)
        )
    )
    (princ)
)
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 779
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: Wspórzędne rastra za pomocą VBA

Postprzez ahzak » kwi 06, 2019 00:40

Dziękuję za odpowiedź, ale jest to napisane w Lispie a nie w VBA. Nie wiem, jak to uruchomić :(
ahzak
 
Posty: 3
Dołączył(a): mar 28, 2019 15:29

Re: Wspórzędne rastra za pomocą VBA

Postprzez ziele_o2k » kwi 06, 2019 10:59

ahzak napisał(a):Dziękuję za odpowiedź, ale jest to napisane w Lispie a nie w VBA. Nie wiem, jak to uruchomić :(

Najprościej:
  1. stwórz plik tekstowy
  2. zmień jego rozszerzenie z .txt na .lsp
  3. skopiuj mój kod do tego pliku i go zapisz
  4. wczytaj program przeciągając plik do autocada, albo użyj wczytywania ac
    1.jpg
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 779
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań


Powrót do Pytania studentów, laików i początkujących

Kto przegląda forum

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