Keresés

Új hozzászólás Aktív témák

  • Fire/SOUL/CD

    félisten

    válasz Mzmatus #3198 üzenetére

    Annyira el voltam havazva melóval, hogy teljesen kiment a fejemből, hogy hosszúhétvége lesz... :DDD
    Szóval felpattintottam az AutoCAd 2026-t és megnéztem, mit és hogy lehet VB .NET-l mókolni vele, mert az itt elérhető infók a VB .NET-hez vannak "kitalálva" (lehetne C# nyelven is dolgozni amúgy, csak azt egyrészt nem ismerem annyira ill. a VB .NET nagyon hasonlít a VBA-hoz nyelvezetében, felépítésében stb, nyilván nem véletlen)

    A VB .NET kód megírásához Visual Studio 2022 Community Edition-t használtam (ingyenes)

    1. VB .NET Library Class-t (DLL lesz belőle) így kell létrehozni Visual Studio-val

    2. Hogy a megfelelő függvények/osztályok stb rendelkezésre álljanak, ahhoz az AutoCAD-ből 3 referenciát kell hozzáadni, a rendszerből meg egyet. A VB .NET project-t befordítva (build) kapjuk meg majd a DLL-t, ami kell az AutoCAD-nek

    3. AutoCAD megnyit, betöltünk egy létező vagy létrehozunk egy üres project-t kiadjuk a NETLOAD parancsot, majd a megjelenő fájlablakban betöltjük a korábban létrehozott DLL-t

    4. Most futtatjuk a DLL-ben található függvényünket (ez esetben a FireOpenFileDialog nevet viseli)

    5. ha minden rendben, akkor meg kell nyitnia a fájlablakot és amennyiben kiválasztasz egy fájlt (példaprogiban csak DWG/DVB állítottam a szűrőt), akkor egy ablakban kiírja a fájl nevét, teljes útvonalával

    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.Runtime

    Public Class FireAutoCADOpenFileDialogExample
    <CommandMethod("FireOpenFileDialog")>
    Public Sub FireOpenFileDialog()
    Dim MyOpenFileDialog As New Autodesk.AutoCAD.Windows.OpenFileDialog("FIRE/SOUL/CD - VB.NET FileOpenDialog Class",
    "",
    "DWG;DVB",
    "AutoCAD Drawing/Project Files",
    0 'Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags
    )

    If MyOpenFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    System.Windows.Forms.MessageBox.Show(MyOpenFileDialog.Filename)
    Else
    System.Windows.Forms.MessageBox.Show("Nem választottál ki fájlt.")
    End If
    End Sub

    End Class

    Ennyit tudtam tenni az ügy érdekében, rajtad áll, hogy a korábbi WINAPI-s (az VBA kód ugye) avagy emellett döntesz. ;]

    UI: Lehet, hogy érdemes lenne az AutoCAD topikban is érdeklődni, hátha van egyéb (és ami fontos, egyszerűbb) megoldás is.

    UUI: a #3200-ben lévő megoldás nem működik, felejtős, viszont a #3199 kifogástalanul megy AutoCAD-ben is (mondjuk, mint írtam meg lettem volna lepve, ha nem)...

  • Fire/SOUL/CD

    félisten

    válasz Mzmatus #3198 üzenetére

    Közben eszembe jutott egy egyszerű (remélhetőleg AutoCAD VBA-ban is működő) megoldás. Szóval mi lenne, ha egy Excel objektumot hoznánk létre és annak használnánk a függvényeit, pl. a GetOpenFilename függvényt. :DDD
    Próbáld ki, hátha műxik...

    Sub FireAutoCADFileOpenDialog()

    Dim MyExcelApp As Object
    Dim MyFilePath As String

    Set MyExcelApp = CreateObject("Excel.Application")

    MyFilePath = MyExcelApp.GetOpenFilename(Title:="Válassz egy fájlt", _
    FileFilter:="AutoCAD DVB Files (*.dvb),*.dvb")

    If MyFilePath <> "False" Then MsgBox "A kiválasztott fájl: " & MyFilePath

    Set MyExcelApp = Nothing

    End Sub

  • Fire/SOUL/CD

    félisten

    válasz Mzmatus #3198 üzenetére

    Bocs, nincs sok időm jelenleg (még mindig) PH-ra...

    Utánaolvastam, olybá tűnik, hogy 2 megoldás lehet

    1. .NET plugin írásával, akkor beépített funkciók érhetőek el
    (Ez sem okoz gondot (mármint .NET plugin-t írnom, csak ahhoz viszont fel kell pattintanom mindenképp egy AutoCAD-t, talán hétvégén megsasolom)

    2. Hagyományos Winapi függvények használatával, sajna ez összetettebb mutatvány, több infó szükségeltetik hozzá (csomó paramétert és változót kell ismerni stb)

    Ez utóbbit megmutatom hogyan kell elkövetni (x64-re/hez van deklarálva a fileopendialog import stb), ez univerzális kód -bár nem próbáltam AutoCAD-ben, mert nincs fent- ezért mennie kell 100%-ban, bármely VBA-ban is legyen.
    A kód megnyitja a fájlablakot, szűrőt használ (DVB fájlokat listázza csak(rákerestem a neten, az újabb CAD-k ilyen kiterjesztéssel mentik a VBA kódot, ha meg esetleg mégsem, akkor a forrásban írd át a *.DVB-t *.*-ra, akkor minden fájl látszódni fog), ha egy ilyen fájlt kijelölsz, akkor kiírja a teljes útvonalával együtt, ha meg bezárod az ablakot, akkor meg, hogy nem jelöltél ki semmit... Szóval most ennyi fért az időmbe, ha lesz időm hétvégén folyt. köv.

    Option Explicit

    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
    "GetOpenFileNameA" (MYOPENFILENAME As OPENFILENAME) As Long

    Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As LongPtr
    hInstance As LongPtr
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As LongPtr
    lpfnHook As LongPtr
    lpTemplateName As String
    End Type

    Sub GetFileWithFullPath()

    Dim MyOpenFile As OPENFILENAME
    Dim MyResult As Long

    With MyOpenFile
    'kezdő drive/folder
    .lpstrInitialDir = "D:\"
    'fájlablak fejléce
    .lpstrTitle = "Fire/SOUL/CD"
    'fájlablak szűrő
    .lpstrFilter = "AutoCAD VBA" & Chr$(0) & "*.dvb" & Chr$(0)
    'default flag beállítás
    .flags = 0
    .nFilterIndex = 1
    .hwndOwner = 0
    .lpstrFile = String(257, 0)
    .nMaxFile = LenB(.lpstrFile) - 1
    .lStructSize = LenB(MyOpenFile)
    .lpstrFileTitle = .lpstrFile
    .nMaxFileTitle = .nMaxFile
    End With

    MyResult = GetOpenFileName(MyOpenFile)

    If MyResult = 0 Then
    MsgBox ("Nem választottál ki fájlt!")
    Else
    MsgBox (Trim(Left(MyOpenFile.lpstrFile, InStr(1, MyOpenFile.lpstrFile, vbNullChar) - 1)))
    End If

    End Sub

Új hozzászólás Aktív témák