Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  acedCmd innerhalb von WinForms

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von herhans an!   Senden Sie eine Private Message an herhans  Schreiben Sie einen Gästebucheintrag für herhans

Beiträge: 8
Registriert: 31.05.2010

ACAD 2007, .net, C#

erstellt am: 31. Mai. 2010 21:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von herhans an!   Senden Sie eine Private Message an herhans  Schreiben Sie einen Gästebucheintrag für herhans

Beiträge: 8
Registriert: 31.05.2010

ACAD 2007, .net, C#

erstellt am: 01. Jun. 2010 19:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von herhans an!   Senden Sie eine Private Message an herhans  Schreiben Sie einen Gästebucheintrag für herhans

Beiträge: 8
Registriert: 31.05.2010

ACAD 2007, .net, C#

erstellt am: 01. Jun. 2010 21:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


AcedCmdTest.zip

 
Das mit den CommandFlags klappt auch nicht.

Anbei ein Beispiel-Projekt.

Gruß

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 01. Jun. 2010 21:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat


CADde_herhans_20100601_AcedCmdTest.zip

 
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


Sehen Sie sich das Profil von herhans an!   Senden Sie eine Private Message an herhans  Schreiben Sie einen Gästebucheintrag für herhans

Beiträge: 8
Registriert: 31.05.2010

ACAD 2007, .net, C#

erstellt am: 02. Jun. 2010 18:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz