Тема: acedSSGet

как указать ф-ии acedSSGet выделить только из определенных групп

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

Re: acedSSGet

в дебаге пошагово все срабатывает. А в рабочем режиме вылетает. Как с этим бороться? Подскажите

Re: acedSSGet

> wolka
1) Убери: acutRelRb(&eb1);
Ты же используешь автоматическую память под eb1. Ее не следует освобождать.
2) Не следует выполнять  ltr->close(); если ltr.openStatus() !=Acad::eOk
3) По внимательнее с acedSSFree(ss); - похоже, что у тебя не всегда набор освобождается, а в ряде случаев может освобождаться и дважды.
Это несколько замечаний на вскидку. Думаю, что к вылету приводит пункт 1).

Re: acedSSGet

Убрала вообще все закрытия и освобождения - сработало !!! Спасибо.

Re: acedSSGet

> wolka
Закрытия и освобождения чего?
1) Если не будешь освобождать наборы (ss) то быстро достигнешь лимита в 127 - и больше acedSSGet работать не будет.
2) Если пользуешься интеллектуальными указателями (например, AcDbLayerTableRecordPointer), то ltr->close() не нужен - само закроется по выходе из области видимости (в деструкторе).
Успехов! :)