получить список всех документов

Автор Rocky, 06.09.06, 16:07:25

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Rocky

Всем привет!

Не подскажите, как можно получить список всех документов, открытых в сессии Компаса? (чертежей, сборок, деталей)

Rocky

Неужели никто не знает? Неужели вся работа ведется только с активными документами? Как это так?  :~

Rocky

Сам отвечаю.
ksIteratorPtr pIterator = m_pApplication->GetIterator();
VARIANT_BOOL vb = pIterator->ksCreateIterator(D3_DOCUMENT_OBJ, 0);
long objPtr = pIterator->ksMoveIterator("F");
while (objPtr)
{
   IDispatchPtr pDisp = m_pApplication->ksGet3dDocumentFromRef(objPtr);
   if (pDisp)
      {
         ksDocument3DPtr pDocument3D = pDisp;
         vNames.push_back(pDocument3D->fileName);
      }

   objPtr = pIterator->ksMoveIterator("N");
}
pIterator->ksDeleteIterator();


Вообще хотелось бы сказать, что как-то АПИ реализован мягко говоря непонятно. Например, метод открытия документа реализован не у аппликейшена, а у самого объекта документ. Т.е. чтобы открыть документ, я должен взять указатель на интерфейс документа, и у него вызвать метод "открыть". Вообще странно все. Я могу без открытия документа, у документа спросить его имя. Это как? Чье имя вернется, если ничего не открыто??? Я проверил - пустая строка. Слишком уж разнится работа с объектами типа деталь/сборка и чертеж. Потом как-то маловато функций для работы с КАД-ом...

Никого не хочу обидеть, я пока что только начинаю работать с Компасом, но чесгря уже как то не особо нравится. Я работал с АПИ Инвентора, СолидВоркса, Юниграфикса, даже ПроИнженера чуть-чуть представляю что такое. Но вот даже АПИ UG более понятно и логично.....

olden

Цитата: Rocky от 28.09.06, 12:14:19
Вообще хотелось бы сказать, что как-то АПИ реализован мягко говоря непонятно.

Полностью согласен.

chelkar

Если КОМПАС V7 и выше то можно так:

IApplication::Documents - Получить коллекцию открытых документов

IDocuments::Open - Открыть документ по указанному пути, документ добавялется в коллекцию Documents

Rocky

У меня 8-й компас стоит, исп. АПИ 5. Работаю с tlb-хами через COM.... Странно, но IApplication::Documents не видно такого....

chelkar

Интерфейс из АПИ 7. Там искать надо

timurfortel

После некоторого ковыряния SDK, написал следующий код. Может кому пригодится:


_Documents2D = new Document2D[0];
ksIterator pIterator = (ksIterator)_Application.GetIterator();
pIterator.ksCreateIterator(KAPITypes.ldefin2d.ALL_DOCUMENTS, 0);
int objPtr = pIterator.ksMoveIterator("F");
while (objPtr != 0)
{
    switch ((KAPITypes.DocType)_Application.ksGetDocumentType(objPtr))
    {
        case KAPITypes.DocType.lt_DocFragment:
        case KAPITypes.DocType.lt_DocSheetStandart:
        case KAPITypes.DocType.lt_DocSheetUser:
        case KAPITypes.DocType.lt_DocSpc:
        case KAPITypes.DocType.lt_DocSpcUser:
            Array.Resize<Document2D>(ref _Documents2D, _Documents2D.Length + 1);
            _Documents2D[_Documents2D.Length - 1] = (Document2D)_Application.ksGetDocumentByReference(objPtr);
            break;
    }
    objPtr = pIterator.ksMoveIterator("N");
}


Вроде бы получилось "без излишеств".