Acad::ErrorStatus open_save_close(const ACHAR *DWGFileName)
{
struct resbuf DWGMode;
int nRetVal = acedGetVar(_T("SDI"), &DWGMode);
if ( RTNORM != nRetVal) return Acad::eKeyNotFound;
if (DWGMode.resval.rint != 0)
{
// это вариант SDI. сразу не подходит
return Acad::eCantOpenFile;
}
Acad::ErrorStatus es = Acad::eUnrecoverableErrors;
CComPtr<AutoCAD::IAcadDocument> IDoc;
CComPtr<AutoCAD::IAcadApplication> IApp;
CComPtr<AutoCAD::IAcadDocuments> IDocs;
CComPtr<IDispatch> pDisp = acedGetAcadWinApp()->GetIDispatch(TRUE);
if(!pDisp) return Acad::eCantOpenFile;
// взять начальное значение THUMBSAVE (RASTERPREVIEW для ACAD2010-2012)
CString acadVarName = _T("THUMBSAVE");
#if defined(_MSC_VER) && (_MSC_VER == 1500) /* ACAD2010/2011/2012 */
acadVarName = _T("RASTERPREVIEW");
#endif
struct resbuf previewSaveBefore;
nRetVal = acedGetVar(acadVarName.GetString(), &previewSaveBefore);
if ( RTNORM != nRetVal) return Acad::eKeyNotFound;
bool bChanged = false;
if (previewSaveBefore.resval.rint != 1)
{
struct resbuf previewForceSave;
previewForceSave.restype = RTSHORT;
previewForceSave.resval.rint = 1;
nRetVal = acedSetVar(acadVarName.GetString(), &previewForceSave);
if ( RTNORM != nRetVal) return Acad::eKeyNotFound;
bChanged = true;
}
HRESULT hr = pDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&IApp);
if (SUCCEEDED(hr))
{
hr = IApp->get_Documents(&IDocs);
if(SUCCEEDED(hr))
{
_variant_t b(VARIANT_FALSE);
hr = IDocs->Open(_bstr_t(DWGFileName),b,b,&IDoc);
if(SUCCEEDED(hr))
{
hr = IApp->ZoomExtents();
if(SUCCEEDED(hr))
{
//hr = IDoc->Save();
CString strCommand = _T("_QSAVE\n");
BSTR bstCommand = strCommand.AllocSysString();
hr = IDoc->SendCommand(bstCommand);
::SysFreeString(bstCommand);
if(SUCCEEDED(hr))
{
VARIANT saveChanges, fileName;
saveChanges.vt = VT_BOOL;
saveChanges.boolVal = VARIANT_FALSE;
fileName.vt = VT_ERROR;
fileName.scode = DISP_E_PARAMNOTFOUND;
hr = IDoc->Close(saveChanges, fileName);
if(SUCCEEDED(hr))
es = Acad::eOk;
}
}
}
}
}
if (bChanged) acedSetVar(acadVarName.GetString(), &previewSaveBefore);
return es;
}