Тема: acedSSGet
как указать ф-ии acedSSGet выделить только из определенных групп
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → acedSSGet
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
как указать ф-ии acedSSGet выделить только из определенных групп
можно ли использовать эту команду в цикле?
while(){
....
struct resbuf eb1;
eb1.restype=8;
eb1.resval.rstring=(char*)(LPCTSTR)s_LayersIn;// каждый раз меняется имя слоя
eb1.rbnext=NULL;
ads_name ss;
AcDbLayerTableRecordPointer ltr(s_LeyarsOut,acdbCurDwg(),AcDb::kForRead);
if (ltr.openStatus() !=Acad::eOk){
ltr->close();
acedAlert("it is imposible");
recset.MoveNext();
continue;
}
AcDbObjectId layerId=ltr->objectId();
ltr->close();
if(acedSSGet("X",NULL,NULL,&eb1,ss) != RTNORM){
acutRelRb(&eb1);
acedAlert("it is imposible");
recset.MoveNext();
continue;
}
acutRelRb(&eb1);
long length=0;
if ((acedSSLength(ss,&length)!=RTNORM)||(length==0)){
acedSSFree(ss);
acedAlert("it is imposible");
recset.MoveNext();
continue;
}
ads_name ent;
AcDbObjectId id=AcDbObjectId::kNull;
for (long i=0; i<length; i++){
if (acedSSName(ss,i,ent)!=RTNORM) {
// acedSSFree(ss);
continue;}
if (acdbGetObjectId(id,ent)!=Acad::eOk) {
// acedSSFree(ss);
continue;}
AcDbEntity* pEnt=NULL;
if(acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)!=Acad::eOk) {
// acedSSFree(ss);
continue;}
//if ( pEnt->isA() == AcDbBlockReference::desc () ){
// pEnt->close();
// continue;}
pEnt->setLayer(layerId);
pEnt->close();
}
acedSSFree(ss);
один раз проходит хорошо , а потом вылетает весь Autocad
в дебаге пошагово все срабатывает. А в рабочем режиме вылетает. Как с этим бороться? Подскажите
> wolka
1) Убери: acutRelRb(&eb1);
Ты же используешь автоматическую память под eb1. Ее не следует освобождать.
2) Не следует выполнять ltr->close(); если ltr.openStatus() !=Acad::eOk
3) По внимательнее с acedSSFree(ss); - похоже, что у тебя не всегда набор освобождается, а в ряде случаев может освобождаться и дважды.
Это несколько замечаний на вскидку. Думаю, что к вылету приводит пункт 1).
Убрала вообще все закрытия и освобождения - сработало !!! Спасибо.
> wolka
Закрытия и освобождения чего?
1) Если не будешь освобождать наборы (ss) то быстро достигнешь лимита в 127 - и больше acedSSGet работать не будет.
2) Если пользуешься интеллектуальными указателями (например, AcDbLayerTableRecordPointer), то ltr->close() не нужен - само закроется по выходе из области видимости (в деструкторе).
Успехов! :)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → acedSSGet
Форум работает на PunBB, при поддержке Informer Technologies, Inc