高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】files open okay in 1.10 but not in 1.14.02
files open okay in 1.10 but not in 1.14.02
files open okay in 1.10 but not in 1.14.02
hi,
attached are 2 files that open okay in 1.10 but not in 1.14.02. would you please take a look and see why? please also let me know if you have a fix available.
thanks,
chung
both files contain ole2frame item with missing data.
autocad silently erases them at file loading and report nothing.
odamfcapp/ole.cpp while loading the ole data does not handle eof exception.
sergey slezkin
thanks for the quick reply.
following your suggestion, i was able to open the dwg file by calling readfile with partial loading and then catching the eof exception when opening the ole2frame entity.
however, i am still unable to open the dxf file because in this case the readfile function is the one throwing the eof exception.
anyway, will this issue be fixed (making dwgdirect behavor like autocad) in the next release?
thanks again.
you can fix this partialy on your side. if you replace load() function in odamfcapp/ole.cpp with code below, you will be able to load both dwg and dxf with recoverfile().
in next release/update readfile() will work too like in autocad.
code:
void load(odstreambuf& stream)
{
coleclientitem::release();
odoleiteminitstreamptr poleiteminitstream(&stream);
m_frameid = poleiteminitstream->frameid();
coledocument* poledocument = 0;
oddbdatabasedocptr pdb = oddbdatabasedoc::cast(m_frameid.database());
if(pdb.get())
poledocument = pdb->document();
if(poledocument)
{
m_prawdata.release();
file file(stream);
carchive archive(&file, carchive::load);
archive.m_pdocument = poledocument;
// maintain reference balance:
// coledocument calls coleclientitem::internalrelease() in its deletecontents(),
// but it does not add reference in coledocument::additem();
if(!m_pdocument)
{
poledocument->additem(this);
addref();
}
try
{
coleclientitem::serialize(archive);
}
catch(cexception, pexception)
{
cstring msg;
pexception->geterrormessage(msg.getbuffer(256), 256);
cstring msg2;
msg2.format(_t("%s : \"%s\""), pexception->getruntimeclass()->m_lpszclassname, msg);
// remove invalid object from ole document
m_pdocument->removeitem(this);
release();
pexception->delete();
throw oderror(msg2);
}
end_catch
}
else
{
// loading database is not associated with codamfcapp (coledocument)
// so do not load ole object - just store its data.
if(m_prawdata.isnull())
m_prawdata = odrxobjectimpl<odoleitemsimplesthandler>::createobject();
m_prawdata->load(stream);
}
}
sergey slezkin
|