Обучение программированию

Автор Alal, 26.03.16, 09:13:20

« предыдущая - следующая »

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

ТрындецЪ

Я создаю временную группу из выборочных объектов вида,и хочу очистить вид, чтобы вставить в него объекты из временной группы. Как удалить все объекты вида?

Sabahs

VGrupp:=NewGroup(0);
EndGroup;
SelectGroup(VGrupp,2,10E16,10E16,10E16,10E16);
DeleteObj(VGrupp);

ТрындецЪ

Цитата: Sabahs от 03.04.17, 13:15:31
VGrupp:=NewGroup(0);
EndGroup;
SelectGroup(VGrupp,2,10E16,10E16,10E16,10E16);
DeleteObj(VGrupp);

Благодарю! Ответ как всегда точно в цель, код работает.
Но для общего, так сказать, развития хотелось бы  прояснить для себя некоторые моменты.
"10E16,10E16,10E16,10E16" - координаты прямоугольника-ловушки. Судя по значениям координат, это точка в районе планеты Плутон. Из каких соображений выбраны именно эти координаты?

Sabahs

Фактически ловушка равна нулю и стоит далеко от начала координат, чтобы выделить всё, что в неё не попадёт, а попасть туда 100% ничего не может.

ТрындецЪ

Каким образом получить/выделить все геометрические объекты вида (отрезки, окружности, сплайны, кривые и т.п.)?
Находил в SDK экспортную функцию IsGeomObject (obj) -  проверить геометрический объект или нет.
Я не знаком с алгоритмом работы с экспортными функциями,и не уверен, подходит ли она вообще для решения этой задачи.
Пока я нашел такое решение:


# создаю  временную группу для сбора нужных объектов
TempGroup = iDocument2D.ksNewGroup( 1 )

# создаю список типов нужных  объектов
Geometry = [13025, 13072, 13075, 13079, 13083, 13085, 13087, 13093, 13095, 13097, 13099, 13101, 13115, 13151]

# получаю все объекты вида
Objects = iDrawingContainer.Objects( 0 )

# перебираю все объекты
for obj in Objects:

        # если типа объекта нет в списке
        if not obj.Type in Geometry :

            # удаляю его
            iDocument2D.ksDeleteObj (obj.Reference)
       
        # иначе
        else:

            # добавляю объект во временную группу
            add = iDocument2D.ksAddObjGroup( TempGroup, obj.Reference )

Но, как оказалось, не у всех объектов можно получить их тип (обозначение позиции, например).
В общем, мне этот путь совсем не нравится и предполагаю, что есть проще способ.
Можно же на чертеже выделять объекты по стилю линии. Я мог бы вызвать эту команду, но как программно реализовать выбор всех стилей линий во всплывающем окне, я не знаю.

Sabahs

Просто есть ещё контейнер условных обозначений - ISymbols2DContainer.

ТрындецЪ

Цитата: Sabahs от 04.04.17, 10:37:00
Просто есть ещё контейнер условных обозначений - ISymbols2DContainer.

Не знал. Интерфейс ISymbols2DContainer я получил. Как мне теперь разом опустошить весь этот контейнер?
Или придется получать интерфейсы коллекций всех возможных объектов, проверять количество элементов в коллекции и при наличии удалять поштучно?

Sabahs

Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.

ТрындецЪ

04.04.17, 12:35:04 #48 Последнее редактирование: 04.04.17, 15:53:45 от ТрындецЪ
Цитата: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.

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

for obj in Objects:
    try:
        # если типа объекта нет в списке
        if not obj.Type in Geometry :

            # удаляю его
            iDocument2D.ksDeleteObj (obj.Reference)
       
        # иначе
        else:
            # добавляю объект во временную группу
            add = iDocument2D.ksAddObjGroup( TempGroup, obj.Reference )
    except:

Не знаю насколько это верно, но работает.
Попробую переделать с Objects = iDrawingContainer.Objects ( 0 ) на 
Objects = iSelectionManager.SelectedObjects
чтобы не фильтровать лишние интерфейсы.

ТрындецЪ

Цитата: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.

Поковырял я SelectionManager. В выделение так же попадают объекты с интерфейсом ILeader, IPositionLeader и их собратья, которые категорически не выдают своего Type и Reference, в следствие чего, удалить я их через iDocument2D.ksDeleteObj (obj.Reference)  не могу.

Sabahs

Куда они делись?
Просто объекты нужно привести к типу IDrawingObject, т.к. ISelectionManager.SelectedObjects возвращает массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH.

ТрындецЪ

Цитата: Sabahs от 04.04.17, 16:05:22
Куда они делись?
Просто объекты нужно привести к типу IDrawingObject, т.к. ISelectionManager.SelectedObjects возвращает массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH.

Спасибо! Получилось, сам толком не въехал как, но работает. Мозги уже плавятся после тяжёлого дня.

ТрындецЪ

В модели пытаюсь получить внешние информационные переменные, но не могу их программно отделить от не информационных.
Кусок кода:
VariableCollection = iPart.VariableCollection()
iPart.RebuildModel()
VariableCollection.refresh()

for i in range(VariableCollection.GetCount()):
    iVariable = VariableCollection.GetByIndex (i)
    Information = iVariable.Information

Значение Information для всех внешних переменных False, хотя среди них есть и информационные.
Что я делаю не так?

Sabahs

Для чего?
iPart.RebuildModel()
VariableCollection.refresh()

ТрындецЪ

Цитата: Sabahs от 20.04.17, 09:31:48
Для чего?
iPart.RebuildModel()
VariableCollection.refresh()

На случай, если модель требует перестроения.

Sabahs

Для начала проверить, что переменная возвращает, т.к. она не является булевой.   

ТрындецЪ

Цитата: Sabahs от 20.04.17, 11:36:43
Для начала проверить, что переменная возвращает, т.к. она не является булевой.   

Питон говорит, что она булева.

Sabahs

Прикрепите макрос, модель и таблицу переменных.

ТрындецЪ

Цитата: Sabahs от 20.04.17, 15:10:50
Прикрепите макрос, модель и таблицу переменных.

Вот макрос и тестовая модель. Переменные в модели.

Sabahs

Попробовал на Delphi через API5, результат тот же, завтра попробую иначе, хотя это уже ошибка.