| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: acedCmd innerhalb von WinForms (2405 mal gelesen)
|
herhans Mitglied
Beiträge: 8 Registriert: 31.05.2010 ACAD 2007, .net, C#
|
erstellt am: 31. Mai. 2010 21:14 <-- editieren / zitieren --> Unities abgeben:
Hi! Ich versuche innerhalb einer .Net-Windows-Forms über Einbinden der COM-Routine acedCmd-Routine aufzurufen. Dies funktioniert nicht. Wenn ich es nicht innerhalb einer Windows-Forms aufrufe funktioniert dies problemlos. Ziel ist es über den entsprechenden Befehl ein Polygon abzurunden. Besten Dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 31. Mai. 2010 21:30 <-- editieren / zitieren -->
Hi, herzlich willkommen bei CAD-de! acedCmd ist eine unmanaged (ARX) -Routine, hat nichts mit COM zu tun, COM wäre, wenn Du z.B. Code: Imports Autodesk.AutoCAD ...Dim tAcadDoc as ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim tAcadDocCOM as Interop.AcadDocument = cType(tAcadDoc.AcadDocument, Interop.IAcadDocument) tAcadDocCOM.Utility.SendCommand(....
Weiters ist die Frage, ob Dein Form in einer EXE steht und Du AutoCAD 'fernsteuerst' oder das Form modal aus einer DLL (im AutoCAD) heraus gestartet ist. Wenn zweiteres, dann hast Du das Form wohl mit einem selbstdefinierten Befehl gestartet, welche Attribute hat der Befehl (z.B. Session, ...) und zuletzt, ist das aktive Document gerade gelockt oder nicht, ist ein Befehl aktiv oder nicht, .... Mach mal ein kleines Beispiel, damit wir Deinen Strukturaufbau erkennen können (ein Form, den Startvorgang, einen Button mit dem Command-Aufruf), zippe das Projekt und lade es hier hoch ==> damit wird's deutlich leichter. - alfred - PS: Hilfe zum Upload findest Du >>>hier<<< ------------------ www.hollaus.at |
herhans Mitglied
Beiträge: 8 Registriert: 31.05.2010 ACAD 2007, .net, C#
|
erstellt am: 01. Jun. 2010 19:35 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die schnelle Antwort! Eigentlich ist der Aufbau ganz einfach. Also, ich gehe folgendermaßen vor: ich definiere über CommandMethod eine Methode als Befehl. Innerhalb dieser Methode erzeuge ich ein neues PaletteSet, dem ich mein eigenes Control hinzufüge, dass von System.Windows.Forms.UserControl ableitet. Innerhalb eines Button-Clicks wird dann die Unmanaged-Routine aufgerufen. Und das funktioniert nicht.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 01. Jun. 2010 19:47 <-- editieren / zitieren -->
Hi, >> Eigentlich ist der Aufbau ganz einfach. Ja, wenn alles, was einfach erscheint, auch richtig wäre >> ich definiere über CommandMethod
Und wie sehen die Attribute (die CommandFlags) der Befehlsdefinition aus. Und hast Du das Document zum Zeitpunkt des Befehls-Sendens gelockt oder nicht? Und wie gehst Du von dotNET mit acedCMD um (wie startest Du es)? Sorry, aber aus der Sicht dessen, der NICHT auf Deinen Bildschirm sieht, stecken da eine Menge potentielle Zündstellen drin, darum meine Nachfrage nach einem Beispiel. Ich mach mir ja auch immer ein kleines Sample, wenn mein großes Zeugs nicht funkt, um mal auf das prinzipelle Problem rückschliessen zu können. Das würde Dir genauso helfen (und jetzt auch mir bei der Unterstützung). Beispiel von mir, wo ich auch eine Palette mit UserControls lade (um daraus z.T. auch direkt die Befehlszeile zu torpedieren): Code: Imports Autodesk.AutoCAD.Runtime ...<CommandMethod("OOCLoad", CommandFlags.Redraw Or CommandFlags.UsePickSet Or CommandFlags.Session)> _ Public Shared Sub OOCLoad() 'und darin starte ich die palette, aus der ich End Sub
- alfred -
------------------ www.hollaus.at |
herhans Mitglied
Beiträge: 8 Registriert: 31.05.2010 ACAD 2007, .net, C#
|
erstellt am: 01. Jun. 2010 21:11 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 01. Jun. 2010 21:45 <-- editieren / zitieren -->
Hi, ich hab Dein Problem nicht gelöst (zu wenig Zeit gerade), aber eine Alternative, die ich als gleichwertig ansehe. Lass wissen, ob's Dir hilft: Neu zu deklarieren:
Code: [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "?acedPostCommand@@YAHPB_W@Z")] public extern static int acedPostCommand32(string CommandStr); [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "?acedPostCommand@@YAHPEB_W@Z")] public extern static int acedPostCommand64(string CommandStr);
Und der Aufruf funktioniert dann sowohl in 'method1' als auch aus dem UserControl:
Code: MyClass.acedPostCommand32("_CIRCLE 2,2,0 4 ");
...wenn Du 64bit-AutoCAD arbeitest, dann bitte entsprechend die 64-bit-Variante starten HTH, - alfred -
PS: womit arbeitest Du eigentlich als IDE? Denn Dein csproj-File war defekt (sagt zumindest mein VisualStudio2008 und ich musste die csproj-Datei händisch zurechtbiegen. ------------------ www.hollaus.at |
herhans Mitglied
Beiträge: 8 Registriert: 31.05.2010 ACAD 2007, .net, C#
|
erstellt am: 02. Jun. 2010 18:44 <-- editieren / zitieren --> Unities abgeben:
Ich kann mit der Variante aber nur Strings als Kommando absetzen oder? Wenn ich befehle absetze, bei denen ein Objekt ausgewählt werden muss, wie kann ich dieses Objekt denn programmiertechnisch selektieren? Kann ich die Objekt-Id oder das Objekt-Handle mit übergeben? Wenn ich beispielsweise den Befehl "_offset" absetzen will muss ich erst denn Offset angeben (ist ja kein problem), muss dann aber das Objekt angeben von dem der Offset ausgehen soll, und dann die Richtung. Wenn ich einen Kommando inklusive Parameter per String absetzen will, kann ich dann nicht genauso gut SendStringToExecute von dem Document verwenden? Oder hätte deine Variante einen Vorteil? Die IDE, die ich verwende ist übrigens SharpDevelop. Besten Dank für deine umfassende Hilfe. Schöne Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 02. Jun. 2010 20:18 <-- editieren / zitieren -->
Hi, nun, zur Objektselektion kannst Du in Deinen Befehlsstring z.B. einbauen: (handent "3F04") ....selektiert das Objekt mit dem Handle &h3F04 Aber nicht alles bekommst Du über die Befehlszeile hinüber (z.B. Drehen eines Elements, da kannst Du (glaube ich jetzt mal) nicht Basisdrehwinkel und Zielwinkel durch Koordinaten in Form X/Y senden; plus einige Beispiele mehr). Nur ist das (xxxCommand) auch nicht Sinn des Programmierens, denn solches kannst Du ja einfach in einem Menü unterbringen (leichtes Scripting). Dazu kommt, mit keinem xxxCommand bekommst Du Fehlermeldungen in einer Form zurück, dass Du dann noch Herr der Lage bist. Auch das Offset eines Elements solltest Du doch mit den Curve-Funktionen zustandebringen können ohne xxxCommand verwenden zu müssen. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|