Прикладная библиотека на C++ именно в VisualStudio

Автор Elisey Afanasjev, 29.03.19, 14:20:14

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

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

Вы внимательно посмотрите на мою и свои строчки.
ksEntityCollectionPtr pEntityCollection = doc->EntityCollection(o3d_body,True); // коллекция тел
ksBodyCollectionPtr bodycol = feature->EntityCollection(o3d_bodyCollection); // true сюда не воткнуть, только один параметр принимает
ksBodyPtr body = feature->EntityCollection(o3d_body);                        // аналогично. И, согласно документации, возвращает ksBodyPtr

EntityCollection возвращает всегда ksEntityCollection, соответственно в ksEntityCollection находятся указатели на ksEntity, а уже от ksEntity получаете нужный смотря на его тип.
ksBodyPtr body = pEntity->GetDefinition;
+ Благодарностей: 1

Denis78

Попробовал 2 варианта:

1. ksEntityCollectionPtr pEntityCollection = doc->EntityCollection(o3d_bodyCollection, VARIANT_TRUE);
2. ksEntityCollectionPtr pEntityCollection = doc->EntityCollection(o3d_body, VARIANT_TRUE);

В обоих случаях возвращается валидный указатель, но вот GetCount() всегда возвращает нуль:
long cnt = pEntityCollection->GetCount(); // cnt = 0


Код я дал образно, а теперь смотрим в SDK, что можно получить в ksEntityCollection.
ksEntityCollection.png
Лучше API7 использовать, но и там объекты раскиданы по разным контейнерам.
+ Благодарностей: 1

Denis78

Эммм... не совсем понял, мне казалось, что из ksEntityCollection можно получить только элементы, то есть ksEntity

Да и на скрине написано как этот ksEntityCollection получить из других интерфейсов.
Я пробовал и от topPart его получать, и от документа, и от ksFeaturePtr, всегда результат один, GetCount() неизменно возвращает 0.

Такое впечатление, что пропускаю какой-то важный шаг

От ksFeaturePtr вы можете получить - (грани, ребра, вершины).
В принципе, Вам достаточно ребер, их должно быть 12 судя по детали (могут еще три оси попасть).
Из 12 ребер, три комплекта одинаковых, получаете их длину, это Ваши габариты детали.

graphdark

Но габариты детали есть в kspart part = Doc3D -> GetPart(-1); part -> GetGabarit; И рулить габаритами, через редактирование эскиза можно, но зачем. Куда проще, через внешние переменные. Просто у парта коллекцию переменных, а из нее переменную. Просто в ситуации, когда операцией одной деталь получена, можно и эскиз ковырять, а когда операций куда больше?
Снимок.PNG

Denis78

08.02.22, 16:21:17 #46 Последнее редактирование: 08.02.22, 16:36:37 от Denis78
С трехмерными объектами получилось взять грани, ребра, вершины.

А вот с 2D чертежами - нет.
То есть, задача все та же. Перебрать все объекты, из которых чертеж состоит, и прочитать их параметры. То есть, взять объект, его тип (полилиния, окружность, прямоугольник и т.д.) и соответствующие координаты и прочие атрибуты (у окружности это, наверное, координаты центра и радиус, у прямоугольника - координаты углов и т.д.)

Написал такой метод (комментарии внутри):

void CVcprjDlg::OnOpen2D(ksDocument2DPtr& sketchEdit) {
    int n = 0;
    ksIteratorPtr iter(kompas->GetIterator());

    if (iter)
    {
        if (iter->ksCreateIterator(VIEW_OBJ, 0))
        {
            reference ref;
            if (ref = iter->ksMoveIterator(_T("F")))
            {
                do
                {
                    if (sketchEdit->ksExistObj(ref))
                    {
                        long vnum = sketchEdit->ksGetViewNumber(ref);      // vnum равен 0
                        long voCnt = sketchEdit->ksGetViewObjCount(ref);    // voCnt = 9
                        // Вот и все, что я смог отсюда взять, довольно бессмысленно, на мой взгляд
                    }
                }
                while (ref = iter->ksMoveIterator(_T("N")));
            }
            iter->ksDeleteIterator();
        }
    }

    if (iter) {
        if (iter->ksCreateIterator(ALL_OBJ, 0)) {
            reference ref;
            if (ref = iter->ksMoveIterator(_T("F"))) {
                do {
                    if (sketchEdit->ksExistObj(ref))
                    {
                        n++;
                        long s = sketchEdit->ksGetObjectStyle(ref);                      // Бесполезно, 6 типов "1", 3 типа 0 Что это означает, не знаю
                        BSTR nm = sketchEdit->ksGetObjectNameByType(ref);                // Всегда пустая строка
                        ksRectParamPtr rp = kompas->GetParamStruct(ko_RectParam);
                        long res = sketchEdit->ksGetObjGabaritRect(ref, rp);
                        ksMathPointParamPtr lb = rp->GetpBot();
                        ksMathPointParamPtr rt = rp->GetpTop();
                        if (lb && rt)
                        {
                            double x1 = lb->Getx();
                            double x2 = rt->Getx();
                            double y1 = lb->Gety();
                            double y2 = rt->Gety();
                            std::cout << "(" << x1 << ", " << y1 << ") - (" << x2 << ", " << y2 << ")\n";
                            // Удается взять координаты, и они даже верные, но сами по себе они бесполезны, так как представляют собой лишь габариты объектов, а это не то, что надо
                        }
                    }
                } while (ref = iter->ksMoveIterator(_T("N")));
            }

            iter->ksDeleteIterator();
        }
    }
}

Ну, и собственно, сам файл выглядит так

my2d.jpg

p3452

(ИМХО)
Для 2D документа:
if (obj is IView)
...
else
if (obj is IDrawingObject)
...
else
...
для 3D документа
if (obj is IPart7)
...
else
if (obj is IBody7)
   ...
else
if (obj is IFeature7)
        ...
else
if (obj is IModelObject)
...
else
...