| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: DLL wird geladen, Ribbon aber nicht geändert (3097 mal gelesen)
|
kaifreeman Mitglied Projektleiter
Beiträge: 45 Registriert: 29.08.2006 Pentium 4 2*3,2 GHz 2,5 GB RAM NVIDIA Quadro FX1400 Grafikkarte. ProE 2001 und WF2 M191
|
erstellt am: 20. Nov. 2011 16:10 <-- editieren / zitieren --> Unities abgeben:
Abend, Ich habe in VB.net mit Object ARX ein kleines Programm gebastelt das mittlerweile auch gut funktioniert, nun bin ich gerade am verzweifeln weil ich es einfach nicht schaffe das Programm beim Start von AutoCAD korrekt geladen zu bekommen. Das Programm fügt derzeit auf der Ribbon Leiste einen zusätzlichen Reiter und einen Button ein welcher ein Formular aufruft. Lade ich das Programm mit netload manuell dann wird im Ribbon der Reiter erzeugt und mein Button ebenfalls (er funktioniert auch), nun habe ich in die Registry Zitat:
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.2\ACAD-A005:407\Applications\Test] "DESCRIPTION"="Test_Zeichnungsersteller" "LOADCTRLS"=dword:00000002 "MANAGED"=dword:00000001 "LOADER"="C:\\Test\\Test_Konfigurator_ACAD.dll"
eingetragen. Die DLL wird anscheinend auch geladen (eine Versuchsweise eingebaute MSGBOX im Initialise Ereignis zeigt er an aber das Ribbon wird nicht angezeigt. Das ist mein Code zum Laden Code:
Implements Autodesk.AutoCAD.Runtime.IExtensionApplication ''' <summary> ''' Initialisiert den 300H Configurator ''' Written by Ing. Stephan Papst ''' 26.10.2011 ''' V001 ''' </summary> ''' <remarks></remarks> Public Sub Initialize() Implements Autodesk.AutoCAD.Runtime.IExtensionApplication.Initialize 'Module für ACAD erzeugen Dim KConfig_Module As System.Reflection.Module = System.Reflection.Assembly.GetExecutingAssembly().GetModules()(0) Dim KConfig_ModulePath As String = KConfig_Module.FullyQualifiedName Dim v_img As New Images Try KConfig_ModulePath = KConfig_ModulePath.Substring(0, KConfig_ModulePath.LastIndexOf("\")) KConfig_ModulePath = KConfig_ModulePath.Substring(0, KConfig_ModulePath.LastIndexOf("\")) Catch MsgBox("Fehler beim Erstellen der Module" & vbCrLf & "Wenden Sie sich an ihren Administrator", MsgBoxStyle.Critical, "Schwerer Ausnahmefehler") Exit Sub End Try 'Erstellen der Ribbonleiste für den Konfigurator 'Ribbon Controll initialisieren Dim m_rib_con As Autodesk.Windows.RibbonControl = Autodesk.Windows.ComponentManager.Ribbon 'Ribbonleiste: Dim m_rib_tab As New Autodesk.Windows.RibbonTab With m_rib_tab .Title = "Test" .Id = "meintab_tab_id" End With Try m_rib_con.Tabs.Add(m_rib_tab) Catch ex As Autodesk.AutoCAD.Runtime.Exception MsgBox("Fehler beim Erstellen der Ribbon Leiste" & vbCrLf & ex.Message.ToString) End Try
'Ribbon Panel erzeugen 'Quelle Dim m_rib_pan_source As New Autodesk.Windows.RibbonPanelSource Try With m_rib_pan_source .Title = "Konfigurator" End With 'Ein Panel Dim m_rib_pan As New Autodesk.Windows.RibbonPanel With m_rib_pan .Source = m_rib_pan_source End With m_rib_tab.Panels.Add(m_rib_pan)
'Startbutton hinzufügen Dim m_rib_button As New Autodesk.Windows.RibbonButton With m_rib_button .Text = "Starten" .Image = Images.getPicture(My.Resources.logo_kl2) .LargeImage = Images.getPicture(My.Resources.logo_kl2) .Size = Autodesk.Windows.RibbonItemSize.Large .ShowText = True .ShowImage = True .Orientation = System.Windows.Controls.Orientation.Vertical .CommandHandler = New myformladen() End With 'Wizzard Button hinzufügen m_rib_pan_source.Items.Add(m_rib_button) m_rib_tab.IsActive = True Catch ex As Autodesk.AutoCAD.Runtime.Exception MsgBox("Fehler beim Laden des Konfigurators" & vbCrLf & ex.Message.ToString) End Try End Sub
Kann mir jemand einen Tipp geben was ich falsch mache? Danke! ------------------ mfG. Stephan Papst Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 20. Nov. 2011 20:40 <-- editieren / zitieren --> Unities abgeben: Nur für kaifreeman
Hallo Stephan, die Ribbons werden anscheinend erst initialisiert(geladen?), wenn die erste Zeichnung vollständig geöffnet ist. Da es mir schon mal ähnlich wie dir ging, habe ich es am Ende über einen Reactor erledigt, der anspringt, wenn das Document erzeugt ist und dann eben das Manipulieren der Ribbons vornimmt. Nicht ideal, aber es funktioniert. Ärgerlich ist dabei nur, dass mir aufgefallen ist, dass der DocumentCreated-Reactor nicht in allen AutoCAD-Versionen auch beim ersten Document (Zeichnung1.dwg) anspringt. Ich glaube, dass war in der 2009 oder 2010er so. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kaifreeman Mitglied Projektleiter
Beiträge: 45 Registriert: 29.08.2006 Pentium 4 2*3,2 GHz 2,5 GB RAM NVIDIA Quadro FX1400 Grafikkarte. ProE 2001 und WF2 M191
|
erstellt am: 21. Nov. 2011 08:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger Danke für deine Antwort, ich habe sowas in der Art schon befürchtet und versucht über acaddoc.lsp die DLL immer wieder zu laden leider ohne Erfolg. Ich habe leider keinerlei Erfahrung mit einem DocumentCreated Reactor wie könnte so etwas aussehen kannst du mir da einen Tipp geben? Danke ------------------ mfG. Stephan Papst Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 22. Nov. 2011 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für kaifreeman
Hallo, ich habe es so gelöst (C#.Net): im Initialize:
Code:
DocumentCollection docColl = AcadApp.Application.DocumentManager; docColl.DocumentCreated += new DocumentCollectionEventHandler(AdskRibbonDocumentActivated); // und dann eben die Eventroutine: void AdskRibbonDocumentActivated(object sender, DocumentCollectionEventArgs e) { Object _ribbon = 0; try { _ribbon = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("RIBBONSTATE"); } catch { } if (Convert.ToInt16(_ribbon) == 1) { // Hinzufügen der RibbonCommands usw ... } }
Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kaifreeman Mitglied Projektleiter
Beiträge: 45 Registriert: 29.08.2006 Pentium 4 2*3,2 GHz 2,5 GB RAM NVIDIA Quadro FX1400 Grafikkarte. ProE 2001 und WF2 M191
|
erstellt am: 23. Nov. 2011 19:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger Danke für deine Tipps ich habe nun auf Basis deiner Idee den Code in vb.net adaptiert: Code: AddHandler Application.DocumentManager.DocumentActivated, AddressOf acad_ribdocactive
und dann als Routinge:
Code:
Private Sub acad_ribdocactive(ByVal sender As Object, ByVal e As DocumentCollectionEventArgs) Dim rib As [Object] = 0 Try rib = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("RIBBONSTATE") Catch ex As System.Exception MsgBox("Systemvariable konnte nicht gelesen werden!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Fehler") End Try If Convert.ToInt16(rib) = 1 Then 'Code zum adden des Ribbons Catch ex As Autodesk.AutoCAD.Runtime.Exception End Try End If End Sub
Die Anforderungen nun auch in die Reg gepackt und er lädt aber es ist genau das eingetreten was du schon beschrieben hast der Reactor springt nicht bei der ersten Zeichnung an. Gilt also somit auch für ACAD 2012 Mechanical. Im Dev Guide gibt es keine ICHBINFERTIGMITSTARTEN Variable zumindest konnte ich nichts rausfinden. Habe auch versucht eine Datei über den Documentmanager zu erzeugen den Focus zu setzen und dann zu "zerstören" aber das schafft er im INITIALIZE auch nicht. Ich glaube ich werd mal Subscription bemühen müssen Danke für deine Hilfe. ------------------ mfG. Stephan Papst Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.
|
erstellt am: 23. Nov. 2011 21:55 <-- editieren / zitieren --> Unities abgeben: Nur für kaifreeman
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 24. Nov. 2011 06:50 <-- editieren / zitieren --> Unities abgeben: Nur für kaifreeman
Zitat: Original erstellt von kaifreeman: ... aber es ist genau das eingetreten was du schon beschrieben hast der Reactor springt nicht bei der ersten Zeichnung an. Gilt also somit auch für ACAD 2012 Mechanical. ...
Naja, es gibt noch eine Möglichkeit, die du vielleicht antesten kannst. Du kannst einen Reactor basteln, der anspringt, wenn sich der Document-Status ändert. Das passiert beim AutoCAD-Start sehr häufig, du musst dann eben nur abfangen, wenn sich der DocStatus das letzte mal ändert .. also die Zeichnung zur endgültigen Bearbeitung frei gegeben ist. Woran man das erkennt ... keine Ahnung, das wäre deine Aufgabe ;D . oder man geht via try/catch ran .. dann ist's egal. Am Ende sollte sich der Reactor dann aber selber löschen .. damit dieser nicht ständig anspringt. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kaifreeman Mitglied Projektleiter
Beiträge: 45 Registriert: 29.08.2006 Pentium 4 2*3,2 GHz 2,5 GB RAM NVIDIA Quadro FX1400 Grafikkarte. ProE 2001 und WF2 M191
|
erstellt am: 29. Mai. 2012 19:31 <-- editieren / zitieren --> Unities abgeben:
So nach langer Pause habe ich es jetzt relativ pragmatisch gelöst auf die Knöpfe verzichtet und die Teile einfach per CUI Datei eingebunden Shame on me ^^ Danke für eure Hilfe! ------------------ mfG. Stephan Papst Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
d.balogh Mitglied
Beiträge: 21 Registriert: 13.05.2008
|
erstellt am: 21. Nov. 2013 17:35 <-- editieren / zitieren --> Unities abgeben: Nur für kaifreeman
Hallo, ist zwar ein älteres Topic, aber vielleicht dennoch hilfreich. Bei Ribbon-Sachen ist es meiner Erfahrung nach am Besten, den Application.idle Event abzufangen (dieser kommt, wenn acad voll geladen ist) Code: sub initialize() addhandler application.idle, addressof Callback_Appidle end subsub Callback_Appidle (sender as object, e as system.eventargs) 'RibbonStuff Removehandler application.idle, addressof Callback_appidle end sub
Oder so ähnlich... LG, Daniel
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mychefkoch Mitglied
Beiträge: 3 Registriert: 19.01.2014 Acad 2012, VS 2010, C#
|
erstellt am: 19. Jan. 2014 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für kaifreeman
Ist zwar schon älter der Beitrag aber diese Lösung funktioniert einwandfrei: .net c# myplugin.cs Code: // (C) Copyright 2013 by // using System; using Autodesk.AutoCAD.Runtime; using Engineering.Ribbon; using acadApp = Autodesk.AutoCAD.ApplicationServices;// This line is not mandatory, but improves loading performances [assembly: ExtensionApplication(typeof(Engineering.MyPlugin))] namespace Engineering { // This class is instantiated by AutoCAD once and kept alive for the // duration of the session. If you don't do any one time initialization // then you should remove this class. public class MyPlugin : IExtensionApplication { void IExtensionApplication.Initialize() { // Add one time initialization here // One common scenario is to setup a callback function here that // unmanaged code can call. // To do this: // 1. Export a function from unmanaged code that takes a function // pointer and stores the passed in value in a global variable. // 2. Call this exported function in this function passing delegate. // 3. When unmanaged code needs the services of this managed module // you simply call acrxLoadApp() and by the time acrxLoadApp // returns global function pointer is initialized to point to // the C# delegate. // For more info see: // http://msdn2.microsoft.com/en-US/library/5zwkzwf4(VS.80).aspx // http://msdn2.microsoft.com/en-us/library/44ey4b32(VS.80).aspx // http://msdn2.microsoft.com/en-US/library/7esfatk4.aspx // as well as some of the existing AutoCAD managed apps. // Initialize your plug-in application here acadApp.Application.Idle += new EventHandler(Application_OnIdle); } void IExtensionApplication.Terminate() { // Do plug-in application clean up here acadApp.Application.Idle -= new EventHandler(Application_OnIdle); } void Application_OnIdle(object sender, EventArgs e) { // Remove the event when it is fired acadApp.Application.Idle -= new EventHandler(Application_OnIdle); AddRibbonItem(); } private void AddRibbonItem() { RibbonEngineering ribbon = new RibbonEngineering(); ribbon.show(); } } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |