Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  ObjectID aus ResultBuffer bekommen

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:  ObjectID aus ResultBuffer bekommen (1422 mal gelesen)
Hunchback
Mitglied
CAD-Tech


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

Beiträge: 63
Registriert: 10.10.2007

Win2K
AutoCAD 2007

erstellt am: 11. Nov. 2008 12:32    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

Wir sind gerade dabei ein paar unserer Lisp-Funktionen zu
Lernzwecken in c# umzuschreiben. Bei der Funktion getattrib
scheitern wir aber momentan. Wie bekommt man aus dem ResultBuffer
die ObjectID?

Code:
using Autodesk.AutoCAD;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using System;

namespace LispApp

{

  public class GetAttributes

  {

    [CommandMethod("GETATTRIB#")]
/*Aufruf von Lisp in der Form (getattrib (car (entsel)) "ATRRIBUTSNAME")
*Rückgabe: Wenn Attribut vorhanden --> string mit Wert des Attributes
*          Wenn Attribut nicht vorhanden --> nil
*/
    public ResultBuffer ListAttributes(ResultBuffer InputBuff)

    {

    //Variablen Definieren:
   
       
      Database db = HostApplicationServices.WorkingDatabase;

      Transaction tr = db.TransactionManager.StartTransaction();
     
      ResultBuffer ResBuff = new ResultBuffer();
     
      Array InputArr = InputBuff.AsArray();
           
      ObjectId ObId =  InputArr.GetValue(0);
     
      string attstr = Convert.ToString (((TypedValue) (InputArr.GetValue(1))).Value);
         
               

      // Transaktion starten

        BlockReference blkRef = (BlockReference)tr.GetObject(ObId,OpenMode.ForRead);

        BlockTableRecord btr =(BlockTableRecord)tr.GetObject(blkRef.BlockTableRecord,OpenMode.ForRead);
     

          btr.Dispose();
         
         
          //Durch die Attribute iterieren:

          AttributeCollection attCol = blkRef.AttributeCollection;

          foreach (ObjectId attId in attCol)

          {

            AttributeReference attRef =(AttributeReference)tr.GetObject(attId,OpenMode.ForRead);
           
           

            if (attRef.Tag == attstr)
           
            {
            ResBuff.Add (new TypedValue (5005,attRef.TextString));
            return ResBuff;
                                     

          }
            else
            {
            ResBuff.Add (new TypedValue (5019));
            return ResBuff;
            }

        }

        tr.Commit();
   
        tr.Dispose();

    }

  }

}



Grüße

Martin

------------------
You seem (in my (humble) opinion (which doesn't mean much)) to be (or possibly could be) more of a Lisp programmer (but I could be (and probably am) wrong).

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


Ex-Mitglied

erstellt am: 11. Nov. 2008 13:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

kannst bitte ganzes Projekt (sln, cs, csproj) gezipt bereitstellen, dann ersparen wir uns die VisualStudio-Projekteinrichtung.

- alfred -

Hunchback
Mitglied
CAD-Tech


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

Beiträge: 63
Registriert: 10.10.2007

Win2K
AutoCAD 2007

erstellt am: 11. Nov. 2008 13: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


getattrib.zip

 
Ok, hier wär's. Wir haben das Projekt mit SharpDevelop erstellt, ich hoffe Visualstudio kommt damit zurecht.

------------------
You seem (in my (humble) opinion (which doesn't mean much)) to be (or possibly could be) more of a Lisp programmer (but I could be (and probably am) wrong).

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


Ex-Mitglied

erstellt am: 11. Nov. 2008 14:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat


MyClass.zip

 
Hi,

hilft Dir das?, die Änderungen habe ich (hoffentlich alle) markiert:

Code:
    // ausgebessert von CommandMethod auf LispFunction (sonst gibts keine rueckgabewerte)
    // rueckgabetyp der funktion auf 'string' ausgebessert
      [LispFunction("GETATTRIB")]
      public string ListAttributes(ResultBuffer InputBuff)
      {

        string tRetVal = "";

        //Variablen Definieren:
        Database db = HostApplicationServices.WorkingDatabase;
        // Transaktion starten
        Transaction tr = db.TransactionManager.StartTransaction();

        Array InputArr = InputBuff.AsArray();
        ObjectId ObId =(ObjectId) ((TypedValue)InputArr.GetValue(0)).Value; //==>korrigiert


        string attstr = Convert.ToString (((TypedValue) (InputArr.GetValue(1))).Value);


        BlockReference blkRef = (BlockReference)tr.GetObject(ObId,OpenMode.ForRead);
        //brauchst hier nicht ==> BlockTableRecord btr =(BlockTableRecord)tr.GetObject(blkRef.BlockTableRecord,OpenMode.ForRead);
        //brauchst hier nicht ==> btr.Dispose();
     
     
          //Durch die Attribute iterieren:
          AttributeCollection attCol = blkRef.AttributeCollection;  //hier solltest du pruefen, ob ueberhaupt attribute vorhanden
          foreach (ObjectId attId in attCol)
          {
            AttributeReference attRef =(AttributeReference)tr.GetObject(attId,OpenMode.ForRead);
            if (attRef.Tag == attstr)                                //vorsicht auf gross-kleinschreibung
            {
          tretval = attRef.TextString;
            }
          }

          //brauchst nicht, weile keine objekte modifiziert wurden==>tr.Commit();
        tr.Dispose();
        return tretval;
      }


- alfred -

Hunchback
Mitglied
CAD-Tech


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

Beiträge: 63
Registriert: 10.10.2007

Win2K
AutoCAD 2007

erstellt am: 11. Nov. 2008 15:25    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

Danke Alfred! Funktioniert tadellos. Ich werd aber die Rückgabe trotzdem  als ResultBuffer realisieren müssen, weil die Funktion bei nichtvorhandensein eines Attributes ein nil zurückgeben sollte (bei "" weiß ich ja nicht ob das Attribut leer ist oder nicht vorhanden).Oder gibt's da eine andere Lösung?

Nochmals dankschön + Grüße

Martin

------------------
You seem (in my (humble) opinion (which doesn't mean much)) to be (or possibly could be) more of a Lisp programmer (but I could be (and probably am) wrong).

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


Ex-Mitglied

erstellt am: 11. Nov. 2008 15:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

könntest probieren <Nothing> zurückzugeben, hab's aber jetzt nicht probiert. Wenn das nicht geht, dann wird wohl ResultBuffer notwendig sein. Mehr Ideen hätte ich nicht dazu.

'Pfusch'-Lösung, aber schneller programmiert wäre ein definierter FehlerString, der in Attributswerten nicht vorkommen kann, z.B. "ErrErrErr" oder Du kannst auch in den Lispaufruf als weiteres Argument den String mitgeben, der im Fehlerfall retourniert werden soll und den verwendest Du dann.

(getattr (car (entsel)) "ATTNAME" "ErrErrErr")

aber eben alles nur halbe Sachen, wenn Du 'nil' brauchst (und natürlich in Lisp auch sinnvoll), wirst Du um ResultBuffer nicht herumkommen.

Schöne Grüße aus Melk - alfred -

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