Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Rückgabewert von Befehlen

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:  Rückgabewert von Befehlen (1760 mal gelesen)
mOfl
Mitglied



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

Beiträge: 22
Registriert: 25.09.2010

erstellt am: 30. Sep. 2010 17:28    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

Hallo,

ich sitze immer noch an dem C#-Programm, das über Flurstücksnummern aus einer Datenbank auf Objekte in einer dwg-Datei zugreift. Mittlerweile klappt das über Objektdaten auch problemlos (herzlichen Dank an Alfred!), ich habe dazu eine Bibliothek erstellt mit einem Befehl, der von meinem Programm aus aufgerufen wird und die Arbeit (pro Flurstücksnummer) macht, aber eine neue - wenn auch banalere - Herausforderung ergibt sich:

Wie weiß mein C#-Programm, dass der Befehl Erfolg hatte? Es wird immer wieder vorkommen, dass es zu einer Flurstücksnummer einfach keine Objekte gibt, dann soll das Programm mit der nächsten weitermachen. Innerhalb von C# wäre das einfach eine Funktion mit bool-Rückgabewert, der false ist, wenn keine Objekte existieren, wobei dann in der großen Schleife die Nummer übersprungen werden würde. Jetzt rufe ich den Befehl jedoch von außen über myCADApp.ActiveDocument.SendCommand() auf. Ich prüfe zwar über Events, wann der Befehl fertig ist, aber ob es geklappt hat, sehe ich nicht.

Gibt es eine Möglichkeit, innerhalb eines Befehls, den ich aus einer mit netload geladenen Bibliothek ausführe, globale Variablen zu setzen oder fangbare Events auszulösen? Zur Not könnte ich auch einen Editoroutput "True" und "False" schreiben, könnte dieser dann gelesen werden? Ich habe bislang auch keine Möglichkeit gefunden, auf den Text der Befehlszeile zuzugreifen.

Viele Grüße

mOfl

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


Ex-Mitglied

erstellt am: 30. Sep. 2010 17:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

wenn Du Fehlerkontrolle brauchst, dann bist Du mit SendCommand nicht gerade am besten Weg. Denn Commands in AutoCAD liefern keinen Rückgabewert.

Mit dem aktuellen Verständnis, wie Deine App derzeit läuft (externe EXE, die dem AutoCAD Befehle schickt, so vermute ich mal), würden mir folgende Varianten einfallen:

a) Du nutzt während des Programmablaufs die User-Variablen (z.B. USERI1), schreibst je nach Status in Deinem internen Ablauf eine Ergebnisnummer hinein, diese Variable kannst Du dann auch aufrufen

b) Du schreibst aus Deiner AutoCAD-internen Funktion ein LOG-File mit, welches Du dann aus der externen EXE einliest

c) geht aber dann nicht mehr mit SendCommand: Du definierst keinen AutoCAD-Befehl, sondern eine LISP-Funktion, rufst die LISP-Funktion auf, diese kann Rückgabewerte zurückgeben. Ob das funktionieren kann, hängt aber jetzt sehr davon ab, wie Deine EXE mit dem DLL zusammenspielt, da weiss ich noch nicht genug drüber.

- alfred -

------------------
www.hollaus.at

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 30. Sep. 2010 17:43    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 Nur für mOfl 10 Unities + Antwort hilfreich

Hallo mOfl,
das ist ganz einfach:
Du deklarierst deine Funktion so, dass diese einen Wert zurück gibt. Im folgenden Beispiel ist das ein Boolen(true/false)

private Boolean IsJa (String _string)
{
  Boolean _result = false;
  if(_string.ToUpper() == "JA")
    _result= true;
  return _result;
}

Aufrufen kannst du das dann mit:

Boolean _isJa = IsJa("Hallo");

Die Variable _isJa ist dann entweder true oder false.


Bei Funktionen mit komplexen Rückgaben musst du die Funktionsparameter mit out definieren. Das nutze ich häufig, wenn ich mehrere Rückgaben erwarte:

private Boolean Get4Points (Point2d _center, out Point2d _ul, out Point2d _ur, out Point2d _or, out Point2d _ol)
{
  ...
  irgendwo hier müssen dann die Variablen _ul, _ur, _or, _ol gesetzt werden.
  ...
  return true/false;
}
Dieses Konstrukt kann man also hervorragend nutzen, um auch Fehler abzufangen. Die Funktion gibt als direkte Rückgabe true/false zurück, und in den out-Parametern sind bei Erfolg dann die entsprechenden Werte.

Point2d _mcenter = new Point2d(0,0);
Point2d _mul;
Point2d _mur;
Point2d _mor;
Point2d _mol;
if(Get4Points (_mcenter, out _mul, out _mur, out _mor, out _mol))
{...
... wenn die Funktion also korrekt ausgeführt wurde, sind in den Variablen _mul, _mur, _mor, _mol die entsprechenden Punktkoordinaten gespeichert und können weiter verarbeitet werden.
}

Bei Fragen ...

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 30. Sep. 2010 17:47    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 Nur für mOfl 10 Unities + Antwort hilfreich

ok, genau lesen .. ich lasse den anderen Beitrag stehen, weil verkehrt ist der ja nicht - hilft nur nicht in deinem speziellen Fall, des 'externen Aufrufs'.

Dazu würde mir als Lösung einfallen, dass du in eine User-Systemvariable (z.B. USERI1 einen Wert schreiben lässt, der Aufschluss über den Erfolg gibt.

Bei Fragen ...

Grüße Holger


EDIT: ok, und jetzt war Alfred schneller  )
------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

   
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!

[Diese Nachricht wurde von Brischke am 30. Sep. 2010 editiert.]

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

mOfl
Mitglied



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

Beiträge: 22
Registriert: 25.09.2010

erstellt am: 30. Sep. 2010 17:53    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

Herzlichen Dank für die raschen Antworten!

Ich weiß, dass ein externer Aufruf von Befehlen nicht der ideale Weg ist, ich versuche das auch auf ein Minimum zu begrenzen, aber ich brauche zumindest für jede Flurstücksnummer meiner Datenbank in der C#-Applikation einen Aufruf für AutoCAD. Die User-Variable hört sich aber recht gut an, wenn ich darauf gut zugreifen kann. Ich werde mal ein bisschen damit spielen und mich bei Bedarf nochmal melden.

Gruß
mOfl

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


Ex-Mitglied

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

Hi,

wenn Du das Document-Object als managed-Objekt in der Hand hast, dann hast Du mit
AcadDoc.Database.Useri1
die Variable im Zugriff.

Arbeitest Du über die COM-Schnittstelle, dann wäre schreiben und lesen der Variable so auszuführen:
AcadDocCOM.SetVariable("USERI1", 1)
Dim tVar As Object = AcadDocCOM.GetVariable("USERI1")

- alfred -

------------------
www.hollaus.at

mOfl
Mitglied



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

Beiträge: 22
Registriert: 25.09.2010

erstellt am: 30. Sep. 2010 18:36    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

Abermals vielen Dank für die schnelle Hilfe, mit der User-Variable funktioniert es.

Gruß
mOfl

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

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