• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Как получить габариты деталей, входящих в сборку?

Автор Denis78, 22.02.23, 12:20:45

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

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

Denis78

Пытаюсь получить габариты деталей, входящих в сборку на примере входящей в Компас сборки.
У меня она лежит здесь:
C:\Program Files\ASCON\KOMPAS-3D v18\Libs\PARTLib\DATA\vault\methods\kompas\3d\Bearings\20821\PLib_Bearing_GOST_20821_712.a3d
Это подшипник качения.

Написал такой код:
void GetGabarits(IKompasDocument3DPtr doc3D)
{
    IPart7Ptr part7(doc3D->GetTopPart());           // Берем top part
    if (part7)
    {
        IParts7Ptr parts = part7->GetParts();
        if (parts && doc3D->GetDocumentType() == ksDocumentAssembly)
        {
            long cnt = parts->GetCount();         // Количество деталей в сборке
            for (long i = 0; i < cnt; i++)
            {
                IModelObjectPtr mi = parts->GetItem(i);
                IFeature7Ptr f = mi->GetOwner();
                double x1, y1, z1, x2, y2, z2;
                if (f)
                {
                    _variant_t b = f->GetResultBodies();
                    IBody7Ptr body = (IDispatch*)(b);
                    body->GetGabarit(&x1, &y1, &z1, &x2, &y2, &z2);   // Здесь, непосредственно, получаем габарит детали
                    Printp("GetGabarit from feature7 point1", x1, y1, z1); // Printp() - функция, выводящая координаты точки
                    Printp("GetGabarit from feature7 point2", x2, y2, z2);
                }

                // Еще вариант получения габаритов, но совершенно нерабочий. Возвращает одни нули
                IPart7Ptr pi(mi);                 // Деталь i-ая
                IPartPtr pp(pi);
                IBody7Ptr b7 = pi->GetBodyById(i);
                if (b7)
                {
                    BSTR b7nm = b7->GetName();
                    b7->GetGabarit(&x1, &y1, &z1, &x2, &y2, &z2);   // Здесь вернутся одни нули
                    Printp("GetGabarit point1", x1, y1, z1);
                    Printp("GetGabarit point2", x2, y2, z2);
                }
            }
        }
    }
}

Вывод будет такой.
Для левого кольца координаты правильные (если открыть в Компасе сборку, то эта деталь там так и будет называться, "левое кольцо"):
GetGabarit from feature7 point1 -18.000000 ,  -29.250000 ,  -29.250000
GetGabarit from feature7 point2 -9.000000 ,  29.250000 ,  29.250000

Казалось бы хорошо, но вот для правого кольца выдаются те же самые(!) габариты:
GetGabarit from feature7 point1 -18.000000 ,  -29.250000 ,  -29.250000
GetGabarit from feature7 point2 -9.000000 ,  29.250000 ,  29.250000

На самом деле, левое и правое кольцо - это одна и та же деталь, но их в сборку входит две штуки.
Но нельзя же две одинаковые детали поместить в одно и то же место в пространстве.

С шариками та же история. Для всех 22 экземпляров возвращается одни и те же габариты:
GetGabarit from feature7 point1 6.410000 ,  24.410000 ,  -2.590000
GetGabarit from feature7 point2 11.590000 ,  29.590000 ,  2.590000

Как же получить действительные значения деталей, которые входят в сборку в количестве больше одной?
(С "одиночными" деталями проблем нет, габариты возвращаются верно)

20821.jpg