| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Zugriff auf das Application Objekt in C# (5716 mal gelesen)
|
sebastianapa Mitglied Student
Beiträge: 20 Registriert: 13.11.2006 .NET 2.0, VS2005, IV11
|
erstellt am: 14. Nov. 2006 12:29 <-- editieren / zitieren --> Unities abgeben:
Hallo, wie kann man in C# (.NET 2.0, VS2005, IV10) auf das Application Objekt zugreifen? Über die globale Variable "ThisApplication" wie in VBA geht es ja scheinbar nicht. Gibt es eine Dokumentation zum Programmieren für Inventor in C# oder auch Beispielprogramme? Aus den Samples des SDK werde ich nicht schlau. Wie groß ist eigentlich der Unterschied zwischen Inventor 10 und 11? Können Add-ins bzw. Standalones für INV 10 auch mit INV 11 benutzt werden? Gruß Sebastian 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: 14. Nov. 2006 13:14 <-- editieren / zitieren --> Unities abgeben: Nur für sebastianapa
Wieso wirst du aus den Beispielen nicht schlau? In: C:\Programme\Autodesk\Inventor 11\SDK\Samples\VCSharp.net\Standalone Applications\Inventor\AutoBolts ist doch ein schönes Beispiel: Code:
private bool ConnectInventor() { try { try { // Get active inventor object m_InventorApplication = System.Runtime.InteropServices.Marshal.GetActiveObject( "Inventor.Application" ) as Inventor.Application; } catch( COMException ) { MessageBox.Show( "AutoBolts : Inventor must be running." ); return false; } // Make sure that at least one document is opened m_AssemblyDocument = m_InventorApplication.ActiveDocument as AssemblyDocument; if( m_AssemblyDocument==null ) { MessageBox.Show( "AutoBolts : An assembly document must be active." ); return false; } } catch( Exception e ) { MessageBox.Show( e.Message ); return false; } return true; }
Einfacher geht es wirklich nicht. Und 10 vs 11? Es kann dir immer passieren, dass der 10er Code unter 11er nicht mehr läuft, jedoch viel unwahrscheinlicher als umgekehrt
------------------ Grüße daywa1k3r FX64 Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastianapa Mitglied Student
Beiträge: 20 Registriert: 13.11.2006 .NET 2.0, VS2005, IV11
|
erstellt am: 14. Nov. 2006 13:34 <-- editieren / zitieren --> Unities abgeben:
Hallo daywa1k3r, Danke für Deine Antwort! Das Sample AutoBolt hatte ich mir auch angeschaut, wenn ich den Zugriff auf das Application Objekt so mache führt das bei mir zur Fehlermeldung: "SecurityException wurde nicht behandelt". Und zwar möchte ich über einen Button eine neue ipt-Datei anlegen: private void cmdNewPart_Click(object sender, EventArgs e) { Inventor.Application m_InventorApplication; m_InventorApplication = System.Runtime.InteropServices.Marshal.GetActiveObject( "Inventor.Application" ) as Inventor.Application; m_InventorApplication.Documents.Add(DocumentTypeEnum.kPartDocumentObject, "Bauteil", true); m_InventorApplication.ActiveDocument.Save(); } Oder liegt der Fehler ganz woanders? Gruß Sebastian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastianapa Mitglied Student
Beiträge: 20 Registriert: 13.11.2006 .NET 2.0, VS2005, IV11
|
erstellt am: 14. Nov. 2006 13:44 <-- editieren / zitieren --> Unities abgeben:
...um auszuschließen das ich beim Verweis was falsch gemacht habe: Verweis ist gesetzt auf die Datei "RxInventor.tlb" und im Kopf der *.cs-Datei habe ich folgendes ergänzt: using Inventor;
Ist das so korrekt? Gruß Sebastian
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: 14. Nov. 2006 13:58 <-- editieren / zitieren --> Unities abgeben: Nur für sebastianapa
Hallo, dir ist die Bedeutung von try und catch Anweisungen schon klar? Ich meine ja nur, weil du die komplette Fehlerbehandlung gelöscht hast, und am Ende fragst du dich dann wo der Fehler her kommt?! Hier noch mal eine Funktion die dir ein Inventor.Application Objekt zurück gibt: Code:
public Inventor.Application ConnectInventor() { try { try { // Get active inventor object LocalInvApp = System.Runtime.InteropServices.Marshal.GetActiveObject( "Inventor.Application" ) as Inventor.Application; } catch( COMException ) { MessageBox.Show(rm.GetString("NoInventor"),rm.GetString("MessageCaption"),MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return null; } } catch( Exception e ) { MessageBox.Show( e.Message,rm.GetString("MessageCaption"),MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return null; } return LocalInvApp; }
Bei mir werden die Meldungen wegen Fremdsprachen aus Ressourcen gelesen, so musst du die durch einfachen Strings ersezten. Und mit „Und zwar möchte ich über einen Button eine neue ipt-Datei anlegen:“ glaube ich, dass du ein neues Bauteil (Vorlage) öffnen meinst. Da wäre das: Code:
m_InventorApplication.Documents.Add(DocumentTypeEnum.kPartDocumentObject, "Bauteil", true);
schon richtig, nur “Bauteil” ist kein Templatename. Da musst due den kompletten Pfad für die Vorlage angeben. Da es mehrere Vorlagen geben kann, musst du da Abfragen, welche dass der Benutzer haben will, und die dann als Argument übergeben. Wenn du einfach die Standard Vorlage nehmen willst, kannst du die über: Code:
oApp.GetTemplateFile...
holen. Mein Rat wäre eine C#.NET Schulung für Inventor zu machen (angenommen du willst dich ernsthaft damit befassen).
------------------ Grüße daywa1k3r FX64 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: 14. Nov. 2006 14:05 <-- editieren / zitieren --> Unities abgeben: Nur für sebastianapa
Zitat: Original erstellt von sebastianapa: ...um auszuschließen das ich beim Verweis was falsch gemacht habe:Verweis ist gesetzt auf die Datei "RxInventor.tlb" und im Kopf der *.cs-Datei habe ich folgendes ergänzt: using Inventor;
Ist das so korrekt? Gruß Sebastian
Als Verweis musst du über COM Verweise die InventorObjectLibrary einbinden. Dadurch wird eine Inventor.Interop.dll erzeugt. using.Inventor ist schon richtig aber auch gefährlich, da es Objekte gibt die sich überschneiden, so z.B. der Application Objekt (System.Application und Inventor.Application). In 2005er wirst du da zwar schon beim eintippen gewarnt, aber sauberer ist, nicht using.Inventor zu machen, sondern immer über Inventor. auf die Objekte zu zu greifen.
------------------ Grüße daywa1k3r FX64 Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|