1

Autocadとvb.netの統合に興味がありました。タスクは、autocadがvb.netコードを使用して自動的に描画できるようにすることです。最終的なプロジェクトでは、tmeplatesと情報を含むcsvファイル(そしてもちろん私のプラグイン)から始めて、ケーブルの描画を自動的に作成できます。

「ユーザーフレンドリー」が私のキーワードです。ユーザーがautocadでコマンドを入力してプラグインをインストールし、それを使用する必要がある実装は好きではありません。このため、私は2つの問題を抱えていました。

1)ユーザーがプラグインを簡単にインストールできるようにする方法を見つける

2)グラフィックインターフェイスを備えた使いやすいプラグインを開発します。

私は解決策を見つけました、そしてそれをあなたと共有したいと思います。

編集:@David wolfeは、autocad 2012以前でプラグインを自動的に起動するソリューションで回答しましたが、私の工場にはautocad2011以降のライセンスしかありません。

4

2 に答える 2

2

2012以降では、2012で導入されたAutoCADオートローダー形式を使用します。インストーラーはそれをフォルダーに抽出するだけで、残りはAutocadが処理します。

http://adndevblog.typepad.com/autocad/2013/01/autodesk-autoloader-white-paper.html

于 2013-02-02T13:37:19.327 に答える
1

編集:@david wolfeは、Autocad 2012以降にプラグインを自動的にインストールするためにこの質問に対する回答を書きましたが、私はautocad2011とautocad2000でも扱っているので、次の解決策を見つけました。

問題1解決策: vb.netで開発されたautocadプラグインはdllファイルです。autocadの起動時に自動的にロードするには、autocadでシステムレジストリを変更する必要があります。それをするために、私はautocadを使わない方法を好みます。vb.netで新しい「Windowsフォームアプリケーション」プロジェクト(INSTALLERと呼ばれる)を作成しました。デフォルトの形式で、プラグインを登録するボタンとプラグインを削除するボタンの2つのボタンを追加しました。注:このサンプルでは、​​dllプラグインファイルを、作成するexeアプリケーション(インストーラー)と同じフォルダーに配置する必要があると判断しました。これがプラグインインストーラー/リムーバーのコードです。まず、モジュールを作成してこのコードを貼り付けます:(コード内のコメントとメッセージの一部はイタリア語です。googletranslateを使用して簡単に自分の言語に翻訳できます)

Imports Microsoft.Win32

Module GeneralFunctions


    Public Sub RegisterModule()

        Dim regKey As RegistryKey
        Dim PathToDll As String
        If MsgBox("Suggerimento: copia questo eseguibile,la dll e gli altri file, in una cartella a piacere prima di avviare la registrazione." & vbCrLf & "Se sposterai successivamente i file, sarà necessario registrare nuovamente il modulo" & vbCrLf & "Proseguire?", MsgBoxStyle.YesNo) <> MsgBoxResult.Yes Then
            Exit Sub
        End If

        PathToDll = System.Windows.Forms.Application.StartupPath & "\SupportoCavi.dll"

        If Not (FileIO.FileSystem.FileExists(PathToDll)) Then
            MsgBox("Il file SupportoCavi.dll non è stato trovato nella cartella")
            Exit Sub
        End If

        On Error GoTo PercorsoNonTrovato

        regKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\Autodesk\AutoCAD", True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\
        Dim keysList() As String = regKey.GetSubKeyNames

        regKey = regKey.OpenSubKey(keysList(0), True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\
        keysList = regKey.GetSubKeyNames()
        regKey = regKey.OpenSubKey(keysList(0), True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:410\
        regKey = regKey.OpenSubKey("Applications", True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:410\Applications

        On Error GoTo CreazioneChiaveFallita
        regKey = regKey.CreateSubKey("cavi") 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:410\Applications\cavi
        regKey.SetValue("DESCRIPTION", "Modulo per la creazione di cavi e cablaggi")
        regKey.SetValue("LOADCTRLS", 2)
        regKey.SetValue("MANAGED", 1)
        regKey.SetValue("LOADER", PathToDll)
        MsgBox("Modulo registrato con successo. Apri autocad per usare il nuovo set di strumenti")
        Exit Sub




PercorsoNonTrovato:
        On Error Resume Next
        Dim more As String = ""
        If Not (IsNothing(regKey)) Then
            more = "Errore su chiave " & regKey.Name
        End If
        MsgBox("Percorso non trovato nel registro di sistema," & vbCrLf & "comunica la tua versione di autocad e questo messaggio di errore a me@me.com  " & vbCrLf & more)
        Exit Sub

CreazioneChiaveFallita:
        On Error Resume Next

        If Not (IsNothing(regKey)) Then
            more = "Errore su chiave " & regKey.Name
        End If
        MsgBox("Errore durante la registrazione del modulo," & vbCrLf & "comunica la tua versione di autocad e questo messaggio di errore a me@me.com  " & vbCrLf & more)
        Exit Sub



    End Sub

    Public Sub UnregisterModule()

        Dim regKey As RegistryKey

        On Error GoTo PercorsoNonTrovato

        regKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\Autodesk\AutoCAD", True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\
        Dim keysList() As String = regKey.GetSubKeyNames

        regKey = regKey.OpenSubKey(keysList(0), True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\
        keysList = regKey.GetSubKeyNames()
        regKey = regKey.OpenSubKey(keysList(0), True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:410\
        regKey = regKey.OpenSubKey("Applications", True) 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:410\Applications

        On Error GoTo EliminazioneChiaveFallita
        regKey.DeleteSubKeyTree("cavi") 'HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:410\Applications\cavi
        MsgBox("Modulo rimosso con successo dal registro di sistema.")
        Exit Sub




PercorsoNonTrovato:
        On Error Resume Next
        Dim more As String = ""
        If Not (IsNothing(regKey)) Then
            more = "Errore su chiave " & regKey.Name
        End If
        MsgBox("Percorso non trovato nel registro di sistema," & vbCrLf & "comunica la tua versione di autocad e questo messaggio di errore a emanuele.vacca@selex-si.com  " & vbCrLf & more)
        Exit Sub

EliminazioneChiaveFallita:
        On Error Resume Next

        If Not (IsNothing(regKey)) Then
            more = "Errore su chiave " & regKey.Name
        End If
        MsgBox("Errore durante la rimozione del modulo," & vbCrLf & "comunica la tua versione di autocad e questo messaggio di errore a emanuele.vacca@selex-si.com  " & vbCrLf & more)
        Exit Sub



    End Sub
End Module

これで、プラグインを登録または登録解除するために、RegisterModule()およびUnregisterModule()サブルーチンを呼び出すだけで済みます。これはインストーラー用の私のGUIです:

インストーラ

問題2解決策: 使いやすいプラグインを作成するには、グラフィカルユーザーインターフェイスを使用するのが最善だと思います。このため、ボタン、ドロップダウンメニュー、画像を含むパレットを作成しました。AutoCADが開かれるたびに、プラグインが自動的に読み込まれ、パレットが作成されます。次のコードは、ボタンとコードを使用してパレットをパーソナライズできる簡単な実装です。まず、新しいプロジェクトを作成し(Windowsコントロールライブラリを作成し)、次のコンポーネントへの参照を追加します。

(AutoCADのバージョンによっては、このパスが変更される場合があります)

C:\ Program Files \ Autodesk \ AutoCAD 2011 \ acdbmgd.dll

C:\ Program Files \ Autodesk \ AutoCAD 2011 \ acmgd.dll

次に、クラスを作成してこのコードを貼り付けます(注:構造など、実装のコードがいくつかありますが、必要に応じて簡単にクリアできます。たとえば、loadDatabaseは、不要なカスタムルーチンです):

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports System.IO

Imports System.Reflection

<Assembly: ExtensionApplication(GetType(adskClass))> 

Public Class adskClass

    Implements IExtensionApplication

    Public currentPath As String

    Public templates() As template

    Public Structure template
        Dim title As String
        Dim description As String
        Dim previewPath As String
        Dim templatePath As String
    End Structure



    Public Sub Initialize() Implements Autodesk.AutoCAD.Runtime.IExtensionApplication.Initialize
        'get current path
        Dim myAssy As [Assembly]
        myAssy = [Assembly].GetExecutingAssembly
        currentPath = myAssy.Location
        currentPath = System.IO.Path.GetDirectoryName(currentPath)

        loadPalette()
        loadDatabase()
    End Sub

    Public Sub Terminate() Implements Autodesk.AutoCAD.Runtime.IExtensionApplication.Terminate
        myPaletteSet.Remove(0)
    End Sub

    ' declare a paletteset object, this will only be created once
    Public myPaletteSet As Autodesk.AutoCAD.Windows.PaletteSet
    ' we need a palette which will be housed by the paletteSet
    Public myPalette As UserControl1

    Public Sub loadPalette()
        ' check to see if it is valid
        If (myPaletteSet = Nothing) Then
            ' create a new palette set, with a unique guid
            myPaletteSet = New Autodesk.AutoCAD.Windows.PaletteSet("SUPPORTO CAVI") ', New Guid("D61D0875-A507-4b73-8B5F-9266BEACD596"))
            ' now create a palette inside, this has our tree control
            myPalette = New UserControl1(Me)

            ' now add the palette to the paletteset
            myPaletteSet.Add("Supporto Cavi", myPalette)
        End If

        ' now display the paletteset
        myPaletteSet.Visible = True





    End Sub



    Public Sub loadDatabase()

        Dim databaseFile As String = currentPath & "\modelli\database.csv"
        If Not (FileIO.FileSystem.FileExists(databaseFile)) Then
            MsgBox("Non ho trovato il file database.csv nella cartella modelli per il modulo SUPPORTO CAVI" & vbCrLf & databaseFile)
            Exit Sub
        End If

        'carica file database
        On Error GoTo erroreDuranteCaricamentoDatabase
        Dim tmpstream As StreamReader = File.OpenText(databaseFile)
        Dim strlines() As String
        Dim strline() As String

        strlines = tmpstream.ReadToEnd().Split(Environment.NewLine)
        ReDim templates(UBound(strlines))

        For i As Integer = 0 To UBound(templates)
            strline = strlines(i).Split(",")
            templates(i).title = strline(0)
            Dim tmpFileName = strline(1)
            templates(i).previewPath = currentPath & "\modelli\" & tmpFileName & ".png"
            templates(i).templatePath = currentPath & "\modelli\" & tmpFileName & ".dwg"
            templates(i).description = strline(2)
            myPalette.cableTemplate.Items.Add(templates(i).title)
        Next

        Exit Sub
erroreDuranteCaricamentoDatabase:
        MsgBox("Errore durante il caricamento del database per il modulo SUPPORTO CAVI." & vbCrLf & Err.Description)


    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub




End Class

次に、userControlで、グラフィックビューからコードビューに切り替えて、次のコードを貼り付けます。

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices

'Imports Autodesk.AutoCAD.Windows
Imports Autodesk.AutoCAD.Runtime


Public Class UserControl1

    Public parentClass As adskClass


    Public Sub New(ByVal parent As adskClass)
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        parentClass = parent
    End Sub

    Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    End Class

'Now we create a class that will help us if we have objects that we want to drag and drop from the palette to the autocad draw area. this class detects when the object is "dropped" in the AutoCAD editor. It Inherits from Autodesk.AutoCAD.Windows.DropTarget. 

Public Class MyDropTarget
    Inherits Autodesk.AutoCAD.Windows.DropTarget

    Public Overrides Sub OnDrop(ByVal e As System.Windows.Forms.DragEventArgs)
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

        Try
            Using docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument()
                'Run the AddAnEnt procedure if needed
                'adskClass.AddAnEnt()
            End Using

        Catch ex As System.Exception
            ed.WriteMessage("Error Handling OnDrop: " + ex.Message)
        End Try

    End Sub
End Class

すべてをコンパイルし、生成されたdllファイルを以前に作成したインストーラーパスにコピーしてテストします。

これで、パレットにグラフィックボタン、コード、およびそれを使ってやりたいことを追加する準備が整いました。

これは、AutoCADのパレットのGUIです。 パレット

配布方法:インストーラーexe、dllプラグイン、readmeファイル、そして最終的にはカスタムプラグインに必要なテンプレートまたはその他のファイルをフォルダーに入れます。次に、このフォルダーをZipして、ユーザーに電子メールで送信します。このように、ユーザーはハードディスク内のフォルダーを(一時的なパスではなく)解凍し、exeを開き、[プラグインの登録]ボタンを押すだけで済みます。終了! これで、ユーザーはAutoCADを開いてプラグインを使用できます。

于 2013-02-01T17:02:49.653 に答える