Тема: Вызов диалога "Save as"

Вопрос у меня простой: как вызвать диалоговое окно "сохранить как" с указанным путем.
К открытию диалога известен только полный путь, а пользователь должен сам указать имя файла и сохранить.

Следующий код не вызывает диалог, а все запросы пишутся в командной строке.

int ret;
struct resbuf rbOriginal, rbModified;
acedGetVar(_T("FILEDIA"), &rbOriginal);
// then we set the sysvar to a new value
rbModified.restype=RTSHORT;
rbModified.resval.rint=1;
acedSetVar(_T("FILEDIA"), &rbModified);
ret = acedCommand(RTSTR, _T("_SAVEAS"), RTSTR, _T(""), RTSTR, FullPath,RTNONE);
// set back to the original value
acedSetVar(_T("FILEDIA"), &rbOriginal);

Чего еще не хватает?

Заранее спасибо.

Re: Вызов диалога "Save as"

попробуй это

  struct resbuf *result; 
  int rc, flags; 
  if ((result = acutNewRb(RTSTR)) == NULL) return; 
  result->resval.rstring=NULL; 

  flags = 1;

  rc = acedGetFileD(L"Сохранить как...", // заголовок
      L"c:/",   // путь по-умолчанию. можно сразу с именем файла  
      L"dwg", // расширение файла: NULL - "*".
      flags, // флаги
      result); // а тут то, что увазал пользователь.
  if (rc == RTNORM) 
  {
      acdbHostApplicationServices()->workingDat abase()->saveAs(result->resval.rstring);
  }

Re: Вызов диалога "Save as"

Хорошо, с этим разобрался:

int ret;
struct resbuf rbOriginal, rbModified;
struct resbuf* result;
acedGetVar(_T("FILEDIA"), &rbOriginal);
// then we set the sysvar to a new value
rbModified.restype=RTSHORT;
rbModified.resval.rint=1;
acedSetVar(_T("FILEDIA"), &rbModified);
result = acutNewRb(RTSTR);
if (RTNORM == acedGetFileNavDialog(NULL, vollpfad, _T("dwg;dwt;dxf"), NULL, 33, &result))
   acdbHostApplicationServices()->workingDat abase()->saveAs(result->resval.rstring); 

acutRelRb(result);
// set back to the original value
acedSetVar(_T("FILEDIA"), &rbOriginal);

А вот как/где прочитать ВСЕ возможные расширения, которые есть в окне "Сохранить как" AutoCadа?
Я имею ввиду список из которого можно выбрать формат и версию в которой будет сохранен чертеж.

Re: Вызов диалога "Save as"

Николай пишет:

попробуй это

  struct resbuf *result; 

  int rc, flags; 

  if ((result = acutNewRb(RTSTR)) == NULL) return; 

  result->resval.rstring=NULL; 



  flags = 1;



  rc = acedGetFileD(L"Сохранить как...", // заголовок

     L"c:/",   // путь по-умолчанию. можно сразу с именем файла  

      L"dwg", // расширение файла: NULL - "*".

      flags, // флаги

      result); // а тут то, что увазал пользователь.

  if (rc == RTNORM) 

  {

     acdbHostApplicationServices()->workingDat abase()->saveAs(result->resval.rstring);

  }

Извени, поздно заметил твое сообщение, это как раз то, что я спрашивал.
Только уже сам до этого дошел.
Может подскажешь ответ на мой другой вопрос, по поводу расширений?
Буду очень признателен.

Re: Вызов диалога "Save as"

Есть такая переменная в акаде - SaveFormat.
Проще всего идти через документ а не через базу. Например, так

AcApDocument* pAcadDoc = acDocManager->document(acdbHostApplicationServices()->workingDat abase()) // перешли от базы к документу
AcApDocument::SaveFormat formatBefore = pAcadDoc->formatForSave() // получить текущий тип файла (для текущего документа)
acDocManager->setDefaultFormatForSave(AcApDocument::SaveFormat) // для установки типа файла (сохранение по-умолчанию)

я думаю, разберешься
Прийдется просто сопоставить _T("dwg;dwt;dxf, и др.") с требуемыми форматами файлов. а потом можно и

  acdbHostApplicationServices()->workingDat abase()->saveAs(result->resval.rstring);

Re: Вызов диалога "Save as"

Николай пишет:

Есть такая переменная в акаде - SaveFormat.

Проще всего идти через документ а не через базу. Например, так

AcApDocument* pAcadDoc = acDocManager->document(acdbHostApplicationServices()->workingDat abase()) // перешли от базы к документу

AcApDocument::SaveFormat formatBefore = pAcadDoc->formatForSave() // получить текущий тип файла (для текущего документа)

acDocManager->setDefaultFormatForSave(AcApDocument::SaveFormat) // для установки типа файла (сохранение по-умолчанию)


я думаю, разберешься

Прийдется просто сопоставить _T("dwg;dwt;dxf, и др.") с требуемыми форматами файлов. а потом можно и

  acdbHostApplicationServices()->workingDat abase()->saveAs(result->resval.rstring);

Николай, спасибо за поддержку!

Я вот что хочу получить:
Вместо _T("dwg;dwt;dxf") должно быть _Т("AutoCAD 2000 Drawing (*.dwg);AutoCAD 2000 DXF (*.dxf);AutoCAD 2004 Drawing (*.dwg)") и т.д.
Т.е. мне надо получить список описаний из AcApDocument::SaveFormat.

Возможно ли это сделать, если да, то как?

Возможно мне придется вручную создавать список типа ("AutoCAD 2000 Drawing (*.dwg)" k2000_dwg "AutoCAD 2000 DXF (*.dxf)" k2000_dxf "AutoCAD 2004 Drawing (*.dwg)" k2004_dwg) и потом из него вытаскивать необходимый тип сохранения на основании выбранного пользователем.

И еще вопрос: можно ли прочитать все имена типов из AcApDocument::SaveFormat?

Может есть другой способ реализовать эту задачу.
Буду рад любому предложению!

Re: Вызов диалога "Save as"

И еще вопрос: можно ли прочитать все имена типов из AcApDocument::SaveFormat?

конечно можно. для этого существует справка :) (arxdev.chm. в закладке ПОИСК вбиваешь SaveFormat и наслаждаешься :))

потом из него вытаскивать необходимый тип сохранения на основании выбранного пользователем.

ну где-то так и должно быть. если провести аналогию с обычным CFileDialog, то у него есть порядковый номер выбранного расширения (должно быть и у акадовского, но не искал). ну а потом через switch() выставляешь нужный формат по номеру.

Re: Вызов диалога "Save as"

Николай пишет:

И еще вопрос: можно ли прочитать все имена типов из AcApDocument::SaveFormat?

конечно можно. для этого существует справка   (arxdev.chm. в закладке ПОИСК вбиваешь SaveFormat и наслаждаешься  )

Я имел ввиду напрямую в коде, т.к. в зависимости от версии AutoCADa их может быть больше или меньше.
Точнее даже не прочитать, а записать все элементы из SaveFormat  в список.

Похоже как я и предполагал мне нужно самому создать ENUM типа

enum MySaveFormat {
        k2000_dwg =  "АutoCAD 2000 Drawing (*.dwg)"
        k2000_dxf = "AutoCAD 2000 DXF (*.dxf)"
        k2000_Template = "2000 Drawing Template File (*.dwt)"
}

и из него вытаскивать нужный тип.
Если я не прав, то поправь меня.

Re: Вызов диалога "Save as"

:) ну прочитать и записать - это разные варианты.

помни только о том, что передать в функцию нужно один из вариантов SaveFormat.

acDocManager->setDefaultFormatForSave(AcApDocument::SaveFormat)

В принципе никто не мешает пользоваться и своим енумом, хотя я б пользовался std::map на основе самого последнего варианта SaveFormat.

В любом случае прийдется под каждый автокад ставить затычки, чтоб не вылазили лишние варианты сохранения.
PS: лучше пользуйся просто цифрами а не их символьными обозначениями, т.к. например акад 2000 ничего не знает про, например, k2010_dwg, но вот к цифре 48 будет абсолютно равнодушен при компиляции, и в ходе работы прогаммы если ты поставишь правильную заглушку и он не попытается сохранить документ в этом формате

Re: Вызов диалога "Save as"

Николай пишет:

  ну прочитать и записать - это разные варианты.



помни только о том, что передать в функцию нужно один из вариантов SaveFormat.

acDocManager->setDefaultFormatForSave(AcApDocument::SaveFormat)

В принципе никто не мешает пользоваться и своим енумом, хотя я б пользовался std::map на основе самого последнего варианта SaveFormat.



В любом случае прийдется под каждый автокад ставить затычки, чтоб не вылазили лишние варианты сохранения.

PS: лучше пользуйся просто цифрами а не их символьными обозначениями, т.к. например акад 2000 ничего не знает про, например, k2010_dwg, но вот к цифре 48 будет абсолютно равнодушен при компиляции, и в ходе работы прогаммы если ты поставишь правильную заглушку и он не попытается сохранить документ в этом формате

Да, Николай, здесь ты полностью прав.
Вот только до меня, глупого, никак не доходит следующее:
Kак мне создать список расширений, как это сделано в AutoCadе?
Я имею ввиду выпадающий список типа:

AutoCAD 2007 DWG (*.dwg)
AutoCAD 2007 DXF (*.dxf)
AutoCAD 2000 Drawing (*.dwg)
AutoCAD 2000 DXF (*.dxf)
и т.д.

Пробовал вот так

CString strFormat("AutoCAD 2000 Drawing (*.dwg);AutoCAD 2000 DXF (*.dxf);AutoCAD 2007 DWG (*.dwg);AutoCAD 2007 DXF (*.dxf)");
acedGetFileNavDialog(NULL, vollpfad, strFormat, NULL, 33, &result);

AutoCad кричит, что такой формат не поддерживается.

А в виде

acedGetFileNavDialog(NULL, vollpfad, _Т("dwg;dxf"), NULL, 33, &result)

я не смогу определить версию, в которой нужно сохранить чертеж.

Какой-то замкнутый круг.

Re: Вызов диалога "Save as"

вопрос у меня такой появился, а зачем использовать акадовское окно, если сам процесс сохранения нужно делать ручками? не проще ли пользоваться CFileDialog? в данном случае это по-моему раз в надцать проще :)

Re: Вызов диалога "Save as"

Николай пишет:

вопрос у меня такой появился, а зачем использовать акадовское окно, если сам процесс сохранения нужно делать ручками? не проще ли пользоваться CFileDialog? в данном случае это по-моему раз в надцать проще

Я уже вчера начал переделывать с CFileDialog, просто хотелось все из одной "кастрюли" брать туда же и ложить :)
Думал будет проще, а оказалось как всегда.
Как алтернативу, чтобы коллеги могли пользоваться, пока оставил вот так:

CString strFormat("dwg;dxf");
if (RTNORM == acedGetFileNavDialog(NULL, vollpfad, strFormat, NULL, 33, &result))
{
    // перешли от базы к документу
    AcApDocument* pAcadDoc = acDocManager->document(acdbHostApplicationServices()->workingDat abase());
    // получить текущий тип файла (для текущего документа)
    AcApDocument::SaveFormat formatBefore = pAcadDoc->formatForSave();
    CString strExt(result->resval.rstring);
    strExt.Delete(0, strExt.GetLength()-3);
    // для установки типа файла (сохранение по-умолчанию)
    if (strExt.CompareNoCase(_T("DXF")) == 0)
    {
        acDocManager->setDefaultFormatForSave(AcApDocument::SaveFormat(pAcadDoc->k2007_dxf));
    // SaveAs DXF               acdbHostApplicationServices()->workingDat abase()->dxfOut(result->resval.rstring);
}
else
{
acDocManager->setDefaultFormatForSave(pAcadDoc->k2007_dwg);
acdbHostApplicationServices()->workingDat abase()->saveAs(result->resval.rstring);
}
// Восстановить тип файла (сохранение по-умолчанию)
acDocManager->setDefaultFormatForSave(formatBefore);
}
acutRelRb(result);

Еще раз спасибо за помощь, Николай.
Пока вопросов больше нет, но ... это не значит, что их не будет! :)