Тема: работа dwgInFields()/dwgOutFields() ф-ций

У меня такая проблема:
если в ф-циях dwgInFields()/dwgOutFields() не фильтровать тип филера ,то акад летит,
помогает только отбрасывание всех типов филера, кроме kFileFiler

if(pFiler->filerType() == AcDb::kFileFiler)...

но нужно, чтобы работали все филеры((
что тут может быть?

Re: работа dwgInFields()/dwgOutFields() ф-ций

AcDbHardPointerId, SoftPointerId, AcDbHardOwnershipId или AcDbSoftOwnershipId пользуешь?
Лучше бы показал что у тебя происходит в dwgInFields, тогда легче было бы догадаться в чем дело.

Re: работа dwgInFields()/dwgOutFields() ф-ций

Да,в дополнение
Летит, когда пытаешься двигать ручками
Вот что происходит в dwgInFields()

Acad::ErrorStatus AcDbMyLine::dwgInFields (AcDbDwgFiler *pFiler) {
    assertWriteEnabled () ;
    //----- Сначала читаем ин-фу родительского класса.
    Acad::ErrorStatus es =AcDbPolyline::dwgInFields (pFiler) ;
    if ( es != Acad::eOk )
        return (es) ;
    //----- Читаем версию объекта
    Adesk::UInt32 version =0 ;
    if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk )
        return (es) ;
    if ( version > AcDbGeoLine::kCurrentVersionNumber )
        return (Acad::eMakeMeProxy) ;
    //Восстанавливаем из файла толщину линии
    if(version >= 2)
    {
        double width;
        pFiler->readItem (&width);
        if(SetWidth(width) != Acad::eOk) return Acad::eFilerError;
    }
    //Восстанавливаем из файла признак мультилинии
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        if(version >= 3)
        {
            Adesk::Int32 isMline;
            es = pFiler->readItem(&isMline);
            if(es != Acad::eOk) return es;
            SetMultiLine(isMline);
        }
    }
    //Восстанавливаем из файла Id оффсетной линии
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        if(version >= 3)
        {
            AcDbHardPointerId hardPointer;
            es = pFiler->readItem (&hardPointer);
            if(es != Acad::eOk) return es;
            
            SetLineTypeOffset((AcDbObjectId&)hardPointer);
        }
    }
    //Восстанавливаем вел-ну оффсета 1-й линии
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        double offset1;
        es = pFiler->readItem(&offset1);
        SetOffsetDistance1(offset1);
        if(es != Acad::eOk) return es;
    }
    //Восстанавливаем вел-ну оффсета 2-й линии
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        double offset2;
        es = pFiler->readItem(&offset2);
        SetOffsetDistance2(offset2);
        if(es != Acad::eOk) return es;
    }
    //Восстанавливаем текст паттерна
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        if(version >= 3)
        {
            char *str = NULL;
            es = pFiler->readItem(&str);
            m_PatternText = str;
            acdbFree(str);
            if(es != Acad::eOk) return es;
        }
    }
    //Восстанавливаем признак фигурной линии
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        Adesk::Int16 isShape;
        es = pFiler->readItem(&isShape);
        SetIsShapeLine(isShape);
    }
    //Восстанавливаем Ид словаря с описанием типа линии
    if(pFiler->filerType() == AcDb::kFileFiler)
    {
        AcDbHardPointerId hardPointer;
        es = pFiler->readItem (&hardPointer);
        if(es != Acad::eOk) return es;
            
        SetShapeLineTypeId((AcDbObjectId&)hardPointer);
    }
    return (pFiler->filerStatus ()) ;
}

Re: работа dwgInFields()/dwgOutFields() ф-ций

Во-первых. На своей шкуре убедился, что лучше наследоваться только от AcDbEntity и AcDbObject. У тебя же идет наследование от AcDbPolyline. Поэтому когда там в движении ручек что-то падает - даже не заглянуть дебагером почему. Что там написано остается мраком тайны.
Если надо сделать поведение схожее с AcDbPolyline, то делаешь у себя класс от AcDbEntity, пишешь читаешь в него всю необходимую информацию. А отрисовку и делегирование событий передаешь в методах внутреннего вспомогательного экземпляра AcDbPolyline.
Во-вторых. Кроме AcDbHardPointerId можешь if-ы убрать - все должно работать.
В-третьих. Проверь что после чтения AcDbHardPointerId-ов значение не нулевое и ты не ставишь id_null во всякие типы и т.п. - именно из-за этого все может потом падать в передвижениях и т.п.

Re: работа dwgInFields()/dwgOutFields() ф-ций

Когда будешь смотреть в-третьих, тоже убери все if-ы вокруг AcDbHardPointerId-ов. Поставь проверку что если id_null, то высветиоть AfxMessageBox на экране (шариться вручную дебагером запаришься)

Re: работа dwgInFields()/dwgOutFields() ф-ций

Еще AcDbPolyline помойму комплексная entity и поэтому у нее по своему написан grip и move. Т.е. они создают клон (вызывается dwgIn dwgOut со специальным типом файлера - посмотри каким), возможно там не делается транслирование для AcDbHard...Id - и у тебя получается null или еще что-нибудь в таком роде.

Re: работа dwgInFields()/dwgOutFields() ф-ций

Насчет наследования от AcDbPolyline -
делал версию, наследующую от AcDbCurve и результат был таким-же