| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: IV-Buttonicons - VB.Net AddIn (1809 mal gelesen)
|
BernhardU Mitglied Techniker / Konstrukteur / Student
Beiträge: 328 Registriert: 17.08.2005 Windows XP SP3 AIP 2011 VS 2005
|
erstellt am: 06. Dez. 2005 17:01 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen!! Jaja ich bins schon wieder mal! Das AddIn funktioniert ohne Probleme, doch ich würd jetzt noch gern Icons für den Button in IV integrieregn! Hab auch ein Beispiel in der IV10 -API Hilfe gefunden! Dim oIcon As IPictureDisp Set oIcon = LoadResPicture(101, vbResIcon) Set oButtonDefinition1 = oControlDefinitions.AddButtonDefinition( _ "Button 1", "invrSampleCommand1", _ kQueryOnlyCmdType, "CLSID of the AddIn", _ "This is button 1.", "Button 1", _ oIcon, oIcon) Doch wie schaut das in VB.Net aus?
Ich hab schon alles mögliche versucht, doch ich bin noch zu keiner lösung gekommen!! und ein Button ohne Icon ist doch nur ein halber button!! Vielen Dank!! MFG Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BernhardU Mitglied Techniker / Konstrukteur / Student
Beiträge: 328 Registriert: 17.08.2005 Windows XP SP3 AIP 2011 VS 2005
|
erstellt am: 12. Dez. 2005 09:27 <-- editieren / zitieren --> Unities abgeben:
Hi Leute hat sich schon erledigt! Hab schon herausgefunden, wie es funktioniert!! Dim smallico As stdole.IPictureDisp Dim largeico As stdole.IPictureDisp Dim sma, lar As Image sma = System.Drawing.Image.FromFile("C:\Programme\Autodesk\Inventor 10\Bin\Macros\Modul1.Schriftfeld.small.bmp") lar = System.Drawing.Image.FromFile("C:\Programme\Autodesk\Inventor 10\Bin\Macros\Modul1.Schriftfeld.large.bmp") smallico = VB6.ImageToIPictureDisp(sma) largeico = VB6.ImageToIPictureDisp(lar) obutton = InventorApplication.CommandManager.ControlDefinitions.AddButtonDefinition("Schriftfeld", "Schriftfeld_einfügen:cmdintname1", CommandTypesEnum.kQueryOnlyCmdType, "{ID}"Test", "Test", smallico, largeico) obutton.Enabled = True es funktioniert!!! Das ist toll an einem Montag Morgen so ein erfolgserlebnis!! Trotz dem vielen Dank für eure Bemühungen!! MfG Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tend.heid Mitglied MB-Ing.
Beiträge: 12 Registriert: 09.05.2005
|
erstellt am: 21. Dez. 2005 17:00 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Danke BerhardU für das posten des Codes für das erstellen eines Inventor-Buttons, habs so auch endlich geschafft mein Add-In zum laufen zu kriegen. Auf meinem PC läuft es jetzt auch super, aber wie krieg ich die dll jetzt auf einem anderen PC zum laufen? Ich hab das VB.NET Standard. Kann ich per regasm.exe auf meinem PC eine reg-Datei schreiben lassen, die ich auf jedem anderen PC zur Registrierung verwenden kann, oder muß ein Setup gemacht werden. Das dauert bei mir aber eine halbe Ewigkeit, liegt vieleicht daran, dass die interop.dll von Inventor mit in das Setup kompiliert wird. Muss das sein, oder kann man das Setup-Programm auch so anpassen, dass nur die wirklich benötigten Dateien im Setup landen und die interop auf dem Zielrechner ins Arbeitsverzeichnis kopiert wird. Da stell ich mir schon die nächste Frage: Kann ich im Code auf die interop-datei im Inventor-Verzeichnis verweisen oder ist es sinnvoll meine My.dll ins Inventor-Verzeichnis zu installieren? Da müssten dann aber auch alle benötigten zusätzlichen Dateien rein, wie bmp für die Icons, .txt für das einlesen von Daten, usw. Da ist dann bald ein ganz schönes Durcheinander im Inventor-Verzeichnis. Wenn ich aber die interop.dll in mein Arbeitsverzeichnis kopiere, besteht doch die Gefahr, dass bei einem SP für Inventor diese ausgetauscht wird und ich davon gar nichts mitkriege oder? Danke für eure Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 22. Dez. 2005 10:31 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Hallo tend.heid, Zitat:
Kann ich per regasm.exe auf meinem PC eine reg-Datei schreiben lassen, die ich auf jedem anderen PC zur Registrierung verwenden kann, oder muß ein Setup gemacht werden.
Ja, du kannst mit regasm.exe eine reg-Datei erstellen, oder die regasm.exe mitliefern und vor Ort ausführen. Ein Setup finde ich immer gut, jedoch benutze ich nicht das im Visual Studio enthaltene, sonder ich bevorzuge das InnoSetup. Aber wenn es nur eine dll ist, und du musst es unter Kollegen verteilen, dann muss ein Setup auch nicht sein. Zitat:
… kann man das Setup-Programm auch so anpassen, dass nur die wirklich benötigten Dateien im Setup landen und die interop auf dem Zielrechner ins Arbeitsverzeichnis kopiert wird.
Das ist möglich unter: Projekt Eigenschaften / Erstellen / Für COM-Interop registrieren. Jedoch bin ich der Meinung, dass die interop dll’s sowie die tlb’s nicht mit dem Release mitgeliefert werden müssen. Zitat:
Kann ich im Code auf die interop-datei im Inventor-Verzeichnis verweisen oder ist es sinnvoll meine My.dll ins Inventor-Verzeichnis zu installieren? Da müssten dann aber auch alle benötigten zusätzlichen Dateien rein, wie bmp für die Icons, .txt für das einlesen von Daten, usw.
Wie gesagt, musst du die interops nicht mit installieren. Und die Ressourcen werden normaler Weise in die dll / exe rein kompiliert. Ich habe im Moment auch ein paar Schwierigkeiten mit der Weitergabe einer Assembly, allerdings in C# geschrieben. Es funktioniert nur auf einem Rechner mit der Entwicklungsumgebung (Framework alleine reicht nicht). Muss auch noch schauen was es ist… ------------------ Grüße daywa1k3r FX64 Software Solutions Mold&More Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 22. Dez. 2005 20:51 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
hallo daywa1k3r, erstmal danke für die ausführliche Antwort. Ich hab gestern eine reg-Datei mit regasm erstellt und versucht meine dll damit zu registrieren. Im AddIn-Manager ist die dll auch vorhanden, allerdings ist nach dem IV-Start der Button nicht verfügbar und in den Zusatzmodul-Übersicht ist die dll auch als nicht geladen gekennzeichnet. Kann man beim IV-Start ein log-Datei erstellen lassen oder das laden der dll debuggen, damit ich weiß an was es liegt, dass es nicht geht? Wie meinst du die Resourcen werden in die dll reinkompiliert? Ich wähle im Studio "Verweis hinzufügen" und wähle die inventor.interop. Danach ist die dll in meinem Projektordner. Kann ich auch im Code auf die interop verweisen, so dass die interop im IV-Verzeichnis verwendet wird? Wie kann ich für ein AddIn das Verzeichnis der dll im Code ermitteln? Mit System.AppDomain.CurrentDomain.BaseDirectory() krieg ich das Inventor-Verzeichnis, das hilft aber leider nicht. Danke schon mal
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tend.heid Mitglied MB-Ing.
Beiträge: 12 Registriert: 09.05.2005
|
erstellt am: 23. Dez. 2005 08:18 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Den ersten Punkt konnte ich schon mal beheben. Die dll ist nach dem IV-STart als geladen gekennzeichnet. Allerdings fehlt mir trotzdem der Button und die Schaltfläche. Hab die dll mit regasm My.dll /codebase registriert. Bekomme dann zwar eine Fehlermeldung: die dll bräuchte einen starken Namen, das hab ich dann auch gleich probiert. Das VisualStudio bringt dann die Fehlermeldung: Interop.Inventor.dll hat keinen starken Namen. Wenn es auch ohne starken Namen geht, hab ich damit kein Problem. Warum allerdings die Leiste und der Button nicht da sind ist mir immer noch ein Rätsel. An alle im Forum schon mal "Frohe Weihnachten"
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 23. Dez. 2005 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Hallo, Zitat:
Ich hab gestern eine reg-Datei mit regasm erstellt und versucht meine dll damit zu registrieren. Im AddIn-Manager ist die dll auch vorhanden, allerdings ist nach dem IV-Start der Button nicht verfügbar und in den Zusatzmodul-Übersicht ist die dll auch als nicht geladen gekennzeichnet.
Das kann verschiedene Gründe haben… Meistens ist es so, dass in der Activate während des Ladens von ButtonDefinitions, ToolBars, Icons (darauf tippe ich), usw. ein Problem gibt, und das Programm steigt aus, ohne die Activate komplett zu durchlaufen. Eine andere Möglichkeit ist, dass bei der Registrierung von der Assembly irgendwas schief gegangen ist. Ich habe gestern, nach dem ich alle meiner Rechner zu laufen gebracht habe und somit auf die Rechner von Forum Kollegen zugreifen musste (Hallo Mathias ), festgestellt, dass der Grund warum meine C# Assembly nicht geladen wurde, ein Argument bei der regasm.exe war. Und zwar der CodeBase. Der muss bei der Registrierung benutzt werden, wenn die Assembly nicht in dem GAC registriert ist, sonst weiß die Anwendung, zur welcher das AddIn gehört nicht, wo sich die dll befindet. Also falls dein AddIn eine feste GUID hat, dann suche mal in der Registry danach. Und wenn nirgendwo ein Pfad zu deiner dll angegeben ist, benutze diesen Parameter bei der Registrierung mit regasm.exe (schau mal in msdn rein). Zitat:
Kann man beim IV-Start ein log-Datei erstellen lassen oder das laden der dll debuggen, damit ich weiß an was es liegt, dass es nicht geht?
Ich schreibe mir für solche Fälle immer selbst eine Funktion die eine Log Datei schreibt. Ich gebe dir mal den Code, den du leicht an deine Bedürfnisse anpassen kannst (ich habe es für mich so optimiert, dass immer wenn eine Form aufgerufen wird ein neuer Abschnitt geschrieben wird). Zitat:
Wie meinst du die Resourcen werden in die dll reinkompiliert?
Mit Ressourcen meinte ich die bmp’s, txt’s, … die du in dein Projekt hinzugefügt hast. Aber ehrlich gesagt, hat mich das so dermaßen angewidert, dass ich deshalb auf C# umgestiegen bin. So kann ich dir darüber keine genaue Information geben, aber ich glaube, dass wenn das sowieso nicht automatisch passiert, ich das in den Optionen irgendwo gesehen habe (die Ressourcen mit kompilieren – oder so).# Zitat:
Ich wähle im Studio "Verweis hinzufügen" und wähle die inventor.interop. Danach ist die dll in meinem Projektordner. Kann ich auch im Code auf die interop verweisen, so dass die interop im IV-Verzeichnis verwendet wird?
KORIGIERT! Siehe nächsten Beitrag... Zitat:
Wie kann ich für ein AddIn das Verzeichnis der dll im Code ermitteln? Mit System.AppDomain.CurrentDomain.BaseDirectory() krieg ich das Inventor-Verzeichnis, das hilft aber leider nicht.
Mit: Code:
System.Reflection.Assembly.GetExecutingAssembly.Location()
Bekommst du den kompletten Pfad zu deiner dll. Wenn du den Dateinamen nicht brauchst, dann schneide es einfach ab. ------------------ Grüße daywa1k3r
FX64 Software Solutions Mold&More Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 23. Dez. 2005 09:49 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
|
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 27. Dez. 2005 10:41 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
|
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 27. Dez. 2005 21:59 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Hallo daywa1k3r, wie schreibst du die Log-Datei? Bei meiner dll müsste ja irgendwas in der "Activate" schieflaufen. Wenn ich nach jedem Befehl eine Zeile in die Log-datei mit bezug zu diesem Befehl schreibe sollte das Problem eigentlich schnell gefunden sein. Die dll-Erstellung für IV ist ja schon eine Herausforderung. Der eigentliche Code der dll funktioniert schon seit ca. 2 Monaten, aber die Integration in IV ist für mich, der sonst eigentlich nur exe programmiert schon heavy. Ist die dll-Erstellung eigentlich für jede Anwendung so aufwendig, oder ist das eine IV-Spezialität? Gruß rtend12 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Charly Setter Ehrenmitglied V.I.P. h.c.
Beiträge: 11977 Registriert: 28.05.2002
|
erstellt am: 28. Dez. 2005 00:48 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Zitat: Original erstellt von daywa1k3r: Ein Tester meldete mir gerade die Fehlermeldung über die nicht gefundene Interop.Apprentice.dll. Also, es funktioniert nicht immer ohne die Interops. Wovon es abhängt, ist noch rauszufinden…
Könnte es sein, das Apprentice auf dem betreeffenden Rechner garnicht installiert / registriert war. Dann kann´s auch nicht gefunden werden und muß erst installiert werden. Aber das ist eigentlich trivial
------------------ Der vernünftige Mensch paßt sich der Welt an; der unvernünftige besteht auf dem Versuch, die Welt sich anzupassen. Deshalb hängt aller Fortschritt vom unvernünftigen Menschen ab. (George Bernard Shaw) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 28. Dez. 2005 09:30 <-- editieren / zitieren --> Unities abgeben: Nur für BernhardU
Hallo, Zitat:
wie schreibst du die Log-Datei? Bei meiner dll müsste ja irgendwas in der "Activate" schieflaufen. Wenn ich nach jedem Befehl eine Zeile in die Log-datei mit bezug zu diesem Befehl schreibe sollte das Problem eigentlich schnell gefunden sein.
Ich bin seit geraumer Zeit auf C# umgestiegen, dennoch habe ich ein Beispiel aus meinen ersten Schritten in .NET mit VB gefunden. Da sind die Umstieg Symptome noch sichtbar, denn es wird kein Wert auf die für .NET typische Kapselung gelegt, sondern der ganzer Code ist einfach in ein globales Modul reingeklatscht Die Funktion habe ich geschrieben um eine Form zu logen, aber die ist leicht anpassbar auf deine Bedürfnisse. Code:
Imports System Imports System.IOModule Module1 Public oApp As Inventor.Application Public sFile As String Public Sub Log(ByVal sString As String) Dim sw As StreamWriter = File.AppendText(sFile) If sString = "" Then sw.WriteLine("") Else sw.WriteLine("[" & DateTime.Now & "]" & vbTab & sString) End If sw.Flush() sw.Close() End Sub Public Function CreateLogPath() Dim sw As StreamWriter If Not File.Exists(sFile) Then sw = File.CreateText(sFile) sw.WriteLine("********************************************************") sw.WriteLine("The Log File for daywa1k3rTest1 - " & Date.Now & vbCrLf) sw.WriteLine("Application version: " & oApp.SoftwareVersion.DisplayName) sw.WriteLine("********************************************************") sw.WriteLine("") sw.Flush() sw.Close() Else sw = File.AppendText(sFile) sw.WriteLine("") sw.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") sw.WriteLine(" New Form ") sw.WriteLine(" Document: " & oApp.ActiveDocument.DisplayName) sw.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") sw.WriteLine("") sw.Flush() sw.Close() End If End Function Public Function CreateLogFileName() Dim sFolder As String sFolder = App_Path() & "Log" If Not Directory.Exists(sFolder) Then Directory.CreateDirectory(sFolder) End If sFile = sFolder & "\" & Replace(Replace(Date.Now, ".", "-"), ":", "-") & ".txt" End Function Private Function App_Path() As String Return System.AppDomain.CurrentDomain.BaseDirectory() End Function End Module
Initializiert wird es mit: Code:
CreateLogFileName() CreateLogPath()
Und die einzelnen Schritte aufgerufen z.B.mit: Code:
Log("Activate")
Zitat:
Die dll-Erstellung für IV ist ja schon eine Herausforderung. Der eigentliche Code der dll funktioniert schon seit ca. 2 Monaten, aber die Integration in IV ist für mich, der sonst eigentlich nur exe programmiert schon heavy. Ist die dll-Erstellung eigentlich für jede Anwendung so aufwendig, oder ist das eine IV-Spezialität?
Ich finde nicht, dass es schwierig ist, angenommen man benutzt den mitgelieferten Wizard. Der Wizard ist in der SDK unter Tools zu finden. Einmal installiert, erscheint in VS unter Projekttypen auch Inventor AddIn. Damit wird der wesentliche Konstrukt erstellt, und du fängst mit Erstellen von ButtonDefinitons an… @Mathias Auf dem Rechner ist eigentlich Inventor 10 installiert, und ich gehe davon aus, dass Inventor ohne Apprentice gar nicht installiert werden kann. Keine Ahnung was es ist… Vielleicht ein Versionskonflikt? Mal schauen…
------------------ Grüße daywa1k3r FX64 Software Solutions Mold&More Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|