| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ObjectArx: Farbe von Entities ändert (256 mal gelesen)
|
Robert- Mitglied Student
Beiträge: 14 Registriert: 05.09.2002
|
erstellt am: 06. Sep. 2002 15:01 <-- editieren / zitieren --> Unities abgeben:
Hallo, wenn ich versuche über die Funtkion setColorIndex(...) die Farbe beispielsweise einer Polylinie zu ändern, bekomme ich immer eine Accessviolation, obwohl ich dei Polylinie über getEntity(...) zum schreiben geöffnet habe. Woran liegt das??? Ich habs auch schon mit setRGB und so probiert. Geht auch net. Danke für eure Hilfe. MfG Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 06. Sep. 2002 15:31 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
|
Robert- Mitglied Student
Beiträge: 14 Registriert: 05.09.2002
|
erstellt am: 06. Sep. 2002 15:40 <-- editieren / zitieren --> Unities abgeben:
Hier ist der Code: ... AcDbEntity* pEnt; CString className; AcDbObjectId Id; for ( pIt->start(); !pIt->done(); pIt->step() ) { pIt->getEntity(pEnt, AcDb::kForWrite); className = pEnt->isA()->name(); Id = pEnt->objectId(); acutPrintf("\n Object ist %s", className); pEnt->setColorIndex(3); EvaluateClass(className, Id); /*eigene Methode, zeigt nur Punktkoordinaten in Eingabefenster*/ } pTable->close(); pRec->close(); pEnt->close(); ... Danke das du schon so oft geholfen hast. Find ich gut, bin nämlich gerade erst in AutoCAD und Arx eingestiegen. MfG Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Robert- Mitglied Student
Beiträge: 14 Registriert: 05.09.2002
|
erstellt am: 06. Sep. 2002 15:41 <-- editieren / zitieren --> Unities abgeben:
|
Robert- Mitglied Student
Beiträge: 14 Registriert: 05.09.2002
|
erstellt am: 06. Sep. 2002 15:43 <-- editieren / zitieren --> Unities abgeben:
Hier am besten mal die ganze Funktion: { Acad::ErrorStatus es; AcDbBlockTable* pTable = NULL; AcDbBlockTableRecord* pRec = NULL; es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable, AcDb::kForRead); if (es != eOk) { pTable->close(); return FALSE; } es = pTable->getAt(ACDB_MODEL_SPACE, pRec, AcDb::kForRead); if (es != eOk) { pRec->close(); pTable->close(); return FALSE; } AcDbBlockTableRecordIterator* pIt = NULL; es = pRec->newIterator(pIt); if (es != eOk) { pRec->close(); pTable->close(); return FALSE; } AcDbEntity* pEnt; CString className; AcDbObjectId Id; for ( pIt->start(); !pIt->done(); pIt->step() ) { pIt->getEntity(pEnt, AcDb::kForWrite); className = pEnt->isA()->name(); Id = pEnt->objectId(); acutPrintf("\n Object ist %s", className); EvaluateClass(className, Id); } pTable->close(); pRec->close(); pEnt->close(); return TRUE; } [Diese Nachricht wurde von Robert- am 06. September 2002 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 06. Sep. 2002 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
|
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 06. Sep. 2002 16:06 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
|
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 06. Sep. 2002 16:07 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
|
Robert- Mitglied Student
Beiträge: 14 Registriert: 05.09.2002
|
erstellt am: 06. Sep. 2002 16:14 <-- editieren / zitieren --> Unities abgeben:
Naja erst am Ende aber nich im Iterator. Mal testen. Geht trotzdem nich. Hier der Quellcode mit dem ich getestet habe: Acad::ErrorStatus es; AcDbBlockTable* pTable = NULL; AcDbBlockTableRecord* pRec = NULL; es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable, AcDb::kForRead); if (es != eOk) { pTable->close(); return FALSE; } es = pTable->getAt(ACDB_MODEL_SPACE, pRec, AcDb::kForRead); if (es != eOk) { pRec->close(); pTable->close(); return FALSE; } AcDbBlockTableRecordIterator* pIt = NULL; es = pRec->newIterator(pIt); if (es != eOk) { pRec->close(); pTable->close(); return FALSE; } AcDbEntity* pEnt; CString className; AcDbObjectId Id; for ( pIt->start(); !pIt->done(); pIt->step() ) { pIt->getEntity(pEnt, AcDb::kForWrite); className = pEnt->isA()->name(); Id = pEnt->objectId(); acutPrintf("\n Object ist %s", className); EvaluateClass(className, Id); pEnt->setColorIndex(2); pEnt->close(); } pTable->close(); pRec->close(); return TRUE; Schönes Wochenende! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 06. Sep. 2002 23:37 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
Also ich habe den Code so durchgespielt und er funktioniert, das legt den Verdacht nahe, das der Fehler in deiner eigenen Funktion EvaluateClass(className, Id); auftritt, vielleicht öffnest du das Entity dort nocheinmall obwohl du es ja schon geöffnet hast? // // ObjectARX defined commands, created by Ing. Bernd Cuder [Sep/06/2002], Development, CAD Neubauer & Cuder OEG #include "StdAfx.h" #include "StdArx.h" //----------------------------------------------------------------------------- // This is command 'TEST, by Ing. Bernd Cuder [Sep/06/2002], Development, CAD Neubauer & Cuder OEG void CCNCTestTest() { #ifdef OARXWIZDEBUG acutPrintf ("\nOARXWIZDEBUG - CCNCTestTest() called."); #endif // OARXWIZDEBUG Acad::ErrorStatus es; AcDbBlockTable* pTable = NULL; AcDbBlockTableRecord* pRec = NULL; es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable, AcDb::kForRead); if (es != Acad::eOk) { pTable->close(); return; } es = pTable->getAt(ACDB_MODEL_SPACE, pRec, AcDb::kForRead); if (es != Acad::eOk) { pRec->close(); pTable->close(); return; } AcDbBlockTableRecordIterator* pIt = NULL; es = pRec->newIterator(pIt); if (es != Acad::eOk) { pRec->close(); pTable->close(); return; } AcDbEntity* pEnt; const char *className; AcDbObjectId Id; for ( pIt->start(); !pIt->done(); pIt->step() ) { pIt->getEntity(pEnt, AcDb::kForWrite); className = pEnt->isA()->name(); Id = pEnt->objectId(); acutPrintf("\n Object ist %s", className); // EvaluateClass(className, Id); pEnt->setColorIndex(2); pEnt->close(); } pTable->close(); pRec->close(); }
------------------ Ing. Bernd Cuder Cad&Co makes CAD easy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 06. Sep. 2002 23:47 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
|
Robert- Mitglied Student
Beiträge: 14 Registriert: 05.09.2002
|
erstellt am: 09. Sep. 2002 09:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, klar ich bin ein Depp, ich hab in meiner Funktion das Entity nochmal geöffnet. Bei mir gehts auch mit CString. Ich danke dir für die Hilfe, diesen dummen Fehler hätt ich sonst nie gefunden. Sag mal weist du, ob eine Entity eine Eigenschaft oder Member hat, mit dem ich überprüfen kann, ob es "selekted" ist oder nicht? Sprich ich will eine Aktion nicht über alle Entities in der BlockTable durchführen, sondern nur für markierte. Hab mal den Link zu deiner Page aufgeschlagen. Hört sich gut an. Werd dann in eurer Forum wechseln, denn ich hab ja bis jetzt immer sehr kompetente Hilfe auf Fragen von dir erhalte. Was macht eure Firma noch so? Vetreibt ihr selbstentwickelte Tools für AutoCAD oder stellt ihre sonstige Dienstleistungen zur Verfügung? MfG Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 09. Sep. 2002 10:52 <-- editieren / zitieren --> Unities abgeben: Nur für Robert-
Wenn du mit nur markierte Elemente eine Auswahl meinst: acedSSget -> Auswahlsatz bilden Beispiel Layer ausschalten: // This is command 'LAYOFF' //Schaltet die Layer der gewählten Elemente aus void CCNCLayertoolLayoff() { acutPrintf("\nElemente wählen deren Layer ausgeschaltet werden soll..."); if (acedSSGet(NULL, NULL, NULL, NULL, ssname) !=RTNORM) { acutPrintf("\nNichts ausgewählt"); return; //Programm beenden } //Layer der Elemente ausschalten LayerElem(0); acedSSFree(ssname); } short LayerElem(short Typ) { //Variablen long sslen; long idx; int rc; ads_name ssEntName; struct resbuf *rbSSEnt; struct resbuf *rbTrav; char layName[32]; //Klassenzuweisung pCurDb = acdbHostApplicationServices()->workingDatabase(); pCurDb->getLayerTable(pLayerTable, AcDb::kForWrite); //Code acedSSLength(ssname, &sslen); for (idx = 0; idx < sslen; idx++) { //Elementnamen holen rc = acedSSName(ssname, idx, ssEntName); if (rc != RTNORM) { break; } //Elementdaten holen rbSSEnt = acdbEntGet(ssEntName); if (!rbSSEnt) { break; } //Pointer auf rbSSEnt rbTrav = rbSSEnt; //Layer auslesen while(rbTrav) { switch(rbTrav->restype) { case 8 : strcpy(layName, rbTrav->resval.rstring); break; }//switch rbTrav = rbTrav->rbnext; }//while pLayerTable->getAt(layName, pLayerTableRecord, AcDb::kForWrite, Adesk::kFalse); switch (Typ){ case 0: pLayerTableRecord->setIsOff(Adesk::kTrue); break; case 1: pLayerTableRecord->setIsOff(Adesk::kFalse); break; }//switch pLayerTableRecord->close(); }//for pLayerTable->close(); return (0); } ------------------ Ing. Bernd Cuder Cad&Co makes CAD easy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |