Как переставить местами листы в чертеже?

Программирование для CATIA.

Как переставить местами листы в чертеже?

Сообщение brigval » 09 июн 2010 10:32

Пример в хелпе работает хорошо на VBA

Код: Выделить всё
Set drwsheets = CATIA.ActiveDocument.Sheets
 Set drwsheetsorder =  CATIA.ActiveDocument.DrawingRoot
 Set sheet1 = drwsheets.item(1)
 Set sheet2 = drwsheets.item(2)
 newsheetorder = Array(sheet2, sheet1)
 drwsheetsorder.reorder_Sheets(newsheetorder)


На VB6 работать не хочет. Опрделял drwsheetsorder и newsheetorder как Variant.
Не работает. Выдает "Сбой метода reorder_Sheets"
Что можно предпринять?
Аватара пользователя
brigval
Участник
Участник
 
Сообщения: 74
Зарегистрирован: 03 ноя 2009 14:34

Re: Как переставить местами листы в чертеже?

Сообщение booSter » 14 июн 2010 12:02

VB6 в отличии от скриптов (макросов) использует "раннее связывание" т.е. определяет тип объекта и параметров во время компиляции и генерирует байт-код таким образом, чтобы по возможности использовать прямые вызовы. Скриптовый же движок не "умничает", а сразу пускает все вызовы через IDispatch::Invoke, в который хоть и проверяет типы, но значительно слабее.

А суть проблемы скорее всего в том, что CATIA Automation имеет свои реализации COM-типов VARIANT, SAFEARRAY которые нормально работают в скриптах, но могут вызывать проблемы в системах с ранним связыванием.

Попробуй "разтипизировать" объект drwsheetsorder и вызвать метод (при таком раскладе вызов пойдёт через IDispatch)

Код: Выделить всё
...
Dim objDrwsheetsorder as Object
Set objDrwsheetsorder = drwsheetsorder
...
objDrwsheetsorder.reorder_Sheets(newsheetorder)
...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: Как переставить местами листы в чертеже?

Сообщение brigval » 14 июн 2010 13:56

booSter писал(а):Попробуй "разтипизировать" объект drwsheetsorder и вызвать метод (при таком раскладе вызов пойдёт через IDispatch)

Код: Выделить всё
...
Dim objDrwsheetsorder as Object
Set objDrwsheetsorder = drwsheetsorder
...
objDrwsheetsorder.reorder_Sheets(newsheetorder)
...


Пробовал и как Variant и как Object. Не идет. Такое впечатление, что причиной является нижняя черта. Вообще, я в перевый раз вижу нижнюю черту в методе. Наверное, VB6 тоже ее видит в первый раз :-)
Аватара пользователя
brigval
Участник
Участник
 
Сообщения: 74
Зарегистрирован: 03 ноя 2009 14:34

Re: Как переставить местами листы в чертеже?

Сообщение booSter » 14 июн 2010 19:42

booSter писал(а):... Вообще, я в перевый раз вижу нижнюю черту в методе ...

Таки да, использование символа подчёркивания для VB6 не характерно, но IDL-сигнатура у него (согласно OLEView) тем не менее такая:
Код: Выделить всё
[id(0x60050009), helpcontext(0x0003efd8)]
void reorder_Sheets([in] SAFEARRAY(VARIANT) iOrderedSheets);


Тогда попробуй другое "заклинание" (от слова "клин" ;-) )

Код: Выделить всё
...
CallByName objDrwsheetsorder, "reorder_Sheets", vbMethod, newsheetorder
...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: Как переставить местами листы в чертеже?

Сообщение brigval » 15 июн 2010 10:31

booSter писал(а):
booSter писал(а):.
Тогда попробуй другое "заклинание" (от слова "клин" ;-) )
Код: Выделить всё
...
CallByName objDrwsheetsorder, "reorder_Sheets", vbMethod, newsheetorder
...


Заклинание помогло.
Вот работающий код, который перемещает последний лист на позицию nSheetNumber

Код: Выделить всё
         Dim vNewSheetsOrder  As Variant
         Dim oDrawRoot        As DRAFTINGITF.DrawingRoot
         Const REORDER_SHEETS     As String = "reorder_Sheets"
         Set oSheets = moDrawDoc.Sheets
         sc = oSheets.Count
         '
         Set oDrawRoot = moDrawDoc.DrawingRoot
         ReDim vNewSheetsOrder(0 To sc - 1)
         For s = 1 To sc
            If s = nSheetNumber Then
               Set vNewSheetsOrder(s - 1) = oSheets.Item(sc)
            ElseIf s < nSheetNumber Then
               Set vNewSheetsOrder(s - 1) = oSheets.Item(s)
            ElseIf s > nSheetNumber Then
               Set vNewSheetsOrder(s - 1) = oSheets.Item(s - 1)
            End If
         Next
         CallByName oDrawRoot, REORDER_SHEETS, VbMethod, vNewSheetsOrder


Большое спасибо!
Аватара пользователя
brigval
Участник
Участник
 
Сообщения: 74
Зарегистрирован: 03 ноя 2009 14:34


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0