Переменные в сопряжении

Автор Mary, 13.06.18, 13:53:52

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

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

Есть API5 - ksMateConstraint и ksMateConstraintCollection.
IMateConstraints3D - получают от IKompasDocument3D1 - сборка.

Mary

Есть, и к сожалению не знаю, как получить от них переменные. С передачей интерфейса апи5-апи7 не получилось

Для чего переменные?
В интерфейсе, есть прямое свойство - distance - расстояние между объектами.

Mary

чтобы записать не фиксированный размер, а функцию от внешней переменной. Или можно сразу как-то функцию вписать?

ТрындецЪ

Вот этот код нормально работает, если ksMateConstraint правильный передавать.
Прописывает переменной сопряжения v15 выражение "а":
iMateConstraint3D = iKompasObject.TransferInterface( ksMateConstraint, 2, 0 )
iFeature7 = KAPI7.IFeature7 (iMateConstraint3D)
iVariable7 = iFeature7.Variable(False, False, 'v15')
iVariable7.Expression = 'a'
iDocument3D.RebuildDocument()

Mary

Спасибо, буду пробовать

Mary

Цитата: ТрындецЪ от 14.06.18, 13:11:57
Вот этот код нормально работает, если ksMateConstraint правильный передавать.

метко вы про правильный   ksMateConstraint подметили...
у меня  получается невероятный результат: при первом запуске макроса  для любого компонента сборки iPart = iDocument3D.GetPart(5) 
возвращался NILL для MateConstraintCollection5. Повторный запуск макроса -  так же. Если повторно запустить и изменить номер компонента  iPart = iDocument3D.GetPart(5) - все отрабатывает, возвращается заполненная MateConstraintCollection5 и передача интерфейса работает


iDocument3D = iKompasObject.ActiveDocument3D()
iPart = iDocument3D.GetPart(5)
MateConstraintCollection5 = iDocument3D.GetRequestInfo(iPart).GetMateConstraintCollection()
print MateConstraintCollection5.GetCount()


Прошу прощения за многобукв, отчего может быть такой стабильно нестабильный результат работы кода?

Mary

 Стабильный результат получен с помощью костыля -  кусок кода дважды выполняется через try.  Не ах как красиво, но работает=)

   try:
        iPart = iDocument3D.GetPart(5)
        MateConstraintCollection5 = iDocument3D.GetRequestInfo(iPart).GetMateConstraintCollection()
        print MateConstraintCollection5.GetCount()
        ksMateConstraint  = MateConstraintCollection5.GetByIndex(4*n)
        print ksMateConstraint.constraintType
    except AttributeError:
        print 'try works'
        iPart = iDocument3D.GetPart(0)
        MateConstraintCollection5 = iDocument3D.GetRequestInfo(iPart).GetMateConstraintCollection()
        print MateConstraintCollection5.GetCount()
        ksMateConstraint  = MateConstraintCollection5.GetByIndex(4*n)
        print ksMateConstraint.constraintType


ТрындецЪ

Цитата: Mary от 15.06.18, 10:22:47
... отчего может быть такой стабильно нестабильный результат работы кода?
У меня тоже вчера были проблемы с выявлением детали, к которой относится наложенное сопряжение. Видимо, коллекция деталей сборки, формируется заново при каждом новом открытии этой сборки.
Я сопряжение наложил вручную в сборке из двух деталей. После открытия сборки сопряжение принадлежало либо первой, либо второй детали.
Вы, как я понял, накладываете сопряжение программно. Оно, как я думаю, при добавлении должно попадать в конец массива сопряжений ksMateConstraintCollection. Если это так, то ссылку на это сопряжение можно получить у массива методом ksMateConstraintCollection.Last()

Mary

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

KrissKross

Поиск в сборке сопряжений относящихся к конкретной детали
(актуально для Компас-16 и ниже, средствами API версии 5)

ниже приведен код на C#
            ksDocument3D iDocument3D = kompas5.ActiveDocument3D();
            ksMateConstraintCollection ksMateConstraintCollection = iDocument3D.MateConstraintCollection();

            int countMate = ksMateConstraintCollection.GetCount();
            Console.WriteLine($"Количество сопряжений главной сборки:\t\t {countMate} ");

            ksPartCollection PartCollection5 = iDocument3D.PartCollection(true);

//Индекс искомой детали
            int indexPart = 3;

            ksPart partik2 = PartCollection5.GetByIndex(indexPart);

            dynamic ksMateConstraintsMassiv;

            ksMateConstraintCollection.GetSafeArrayByObj(partik2, out ksMateConstraintsMassiv);

            object[] sds = ksMateConstraintsMassiv;

            Console.WriteLine($"Количество сопряжений {indexPart}-й детали:\t\t {sds.Count()} ");
           
            for (int i = 0; i < sds.Count(); i++)
            {
                ksMateConstraint ksMateConstraint = sds[i] as ksMateConstraint;
                Console.WriteLine($"Тип сопряжения:\t\t {ksMateConstraint.constraintType} ");
            }


Если вкратце словами:
у объекта сборки - ksDocument3D iDocument3D = kompas5.ActiveDocument3D();
получаем объект - ksMateConstraintCollection
и у него вызываем метод GetSafeArrayByObj(partik2, out ksMateConstraintsMassiv);
где
partik2 - объект детали сборки (ksPart)
ksMateConstraintsMassiv - пустой объект, который затем преобразуем в массив, а из массива берем объект сопряжений ksMateConstraint