編集:@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を開いてプラグインを使用できます。