Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  ObjectArx: Farbe von Entities ändert

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:  ObjectArx: Farbe von Entities ändert (256 mal gelesen)
Robert-
Mitglied
Student


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

Beiträge: 14
Registriert: 05.09.2002

erstellt am: 06. Sep. 2002 15:01    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,

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


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

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 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 Robert- 10 Unities + Antwort hilfreich

Kannst du bitte den betroffenen Code hier reinstellen,
so sagt mir das nicht viel.

------------------
Ing. Bernd Cuder
Cad&Co makes CAD easy

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

Robert-
Mitglied
Student


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

Beiträge: 14
Registriert: 05.09.2002

erstellt am: 06. Sep. 2002 15:40    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

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


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

Beiträge: 14
Registriert: 05.09.2002

erstellt am: 06. Sep. 2002 15:41    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

PS: pIt ist ein BlockTableIterator

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

Robert-
Mitglied
Student


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

Beiträge: 14
Registriert: 05.09.2002

erstellt am: 06. Sep. 2002 15: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

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


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

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 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 Robert- 10 Unities + Antwort hilfreich

Also ich kann keinen Fehler sehen, aber ich habe im
Moment auch keinen Compiler an der Hand, erst am Abend wieder.
Ich werde es dann testen.

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


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

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 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 Robert- 10 Unities + Antwort hilfreich

Etwas ist mir jetzt doch aufgefallen, du schließt die
Entities nicht:

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


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

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 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 Robert- 10 Unities + Antwort hilfreich

Ich meine damit

pEnt->close(); in die Schleife setzen,

so schließt du nur das letzte Entity

------------------
Ing. Bernd Cuder
Cad&Co makes CAD easy

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

Robert-
Mitglied
Student


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

Beiträge: 14
Registriert: 05.09.2002

erstellt am: 06. Sep. 2002 16: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

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


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

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 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 Robert- 10 Unities + Antwort hilfreich

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


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

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 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 Robert- 10 Unities + Antwort hilfreich

Möglicherweise liegts auch am

CString className;

ich habe es in

const char  *className;

umwandeln müssen damit es läuft?

------------------
Ing. Bernd Cuder
Cad&Co makes CAD easy

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

Robert-
Mitglied
Student


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

Beiträge: 14
Registriert: 05.09.2002

erstellt am: 09. Sep. 2002 09:34    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 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


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

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 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 Robert- 10 Unities + Antwort hilfreich

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

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