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

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

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

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

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

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

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

Генерация STL файла

Автор Skorb, 07.03.16, 17:43:05

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

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

Skorb

А какого плана должны быть проверки?

Skorb

Например, чтобы все 3 координаты вершины не были 0, или все нормали не были 0?

У меня нормально получает нормали, на рисунках сетка, код и полученные нормали для одной поверхности.
Проверять нужно интерфейсы, что они получены.

Алхимик

Извините не по теме:
http://forum.ascon.ru/index.php?action=dlattach;topic=29158.0;attach=66725;image

Библиотекой не пользовался, но это старый функционал или 16 СП1? Это нарезка с двумя окнами или будет такой функционал под просмотр сетки? Просто интересно можно будет как то его использовать когда компас пишет ошибку в топологии. Видел на isicad что хотят заложить в 17, но пока даже СП нет на 16, о 17 можно и не мечтать :(

Нет, здесь сетку я создавал библиотекой, по данным полученных от интерфейс триангуляции для поверхности, с учётом ограничения размера ребра для триангуляционной пластины.
PS. Библиотека создавалась для личного использования.

Skorb

Я вот тоже сделал проверку и не получается :~


        void Getsurface()
        {
            StreamWriter sw = new StreamWriter("C:\\New1.txt");
            sw.WriteLine("solid");
            int r = 0;
            ksDocument3D iDocument3D = (ksDocument3D)kompas.ActiveDocument3D();
            ksPartCollection coll = (ksPartCollection)iDocument3D.PartCollection(true);
            ksPart part = (ksPart)coll.GetByIndex(4);
            ksEntityCollection Ientitycol = (ksEntityCollection)part.EntityCollection((short)Obj3dType.o3d_face);
            for (r = 0; r < Ientitycol.GetCount(); r++)
            {
               
                ksEntity Ientity = (ksEntity)Ientitycol.GetByIndex(r);
                ksFaceDefinition IFaceDefinition = (ksFaceDefinition)Ientity.GetDefinition();
                ksTessellation ITessellation = (ksTessellation)IFaceDefinition.GetTessellation();
                int j = 0;
                int k = 0;
                ksFacet IFacet = (ksFacet)ITessellation.GetFacet();
                float x = 0, y = 0, z = 0;
                float xn = 0, yn = 0, zn = 0;
                if ((ITessellation != null) && (IFacet!=null)) {
                for (j = 0; j < ITessellation.GetFacetsCount(); j++)
                {
                    ITessellation.GetFacetData(j, IFacet);
                    IFacet.GetNormal(j, out xn, out yn, out zn);
                    sw.WriteLine("facet normal " + xn + " " + yn + " " + zn);
                    sw.WriteLine(" outer loop");
                    for (k = 0; k < IFacet.GetPointsCount(); k++)
                    {
                        IFacet.GetPoint(k, out x, out y, out z);
                        sw.WriteLine("vertex " + x + " " + y + " " + z);
                    }
                    sw.WriteLine("endloop");
                    sw.WriteLine("endfacet");
                }
            }
        }
            sw.WriteLine("endsolid");
            sw.Close();
            kompas.ksMessage("redy");
        }

Skorb

и такая проверка ничего не дает


void Getsurface()
        {
            StreamWriter sw = new StreamWriter("C:\\New1.txt");
            sw.WriteLine("solid");
            int r = 0;
            ksDocument3D iDocument3D = (ksDocument3D)kompas.ActiveDocument3D();
            ksPartCollection coll = (ksPartCollection)iDocument3D.PartCollection(true);
            ksPart part = (ksPart)coll.GetByIndex(4);
            ksEntityCollection Ientitycol = (ksEntityCollection)part.EntityCollection((short)Obj3dType.o3d_face);
            if (Ientitycol != null)
            {
                for (r = 0; r < Ientitycol.GetCount(); r++)
                {

                    ksEntity Ientity = (ksEntity)Ientitycol.GetByIndex(r);
                    ksFaceDefinition IFaceDefinition = (ksFaceDefinition)Ientity.GetDefinition();
                    ksTessellation ITessellation = (ksTessellation)IFaceDefinition.GetTessellation();
                    if (ITessellation != null)
                    {
                        int j = 0;
                        int k = 0;
                        ksFacet IFacet = (ksFacet)ITessellation.GetFacet();
                        float x = 0, y = 0, z = 0;
                        float xn = 0, yn = 0, zn = 0;
                        if (IFacet != null)
                        {
                            for (j = 0; j < ITessellation.GetFacetsCount(); j++)
                            {
                                ITessellation.GetFacetData(j, IFacet);
                                IFacet.GetNormal(j, out xn, out yn, out zn);
                                sw.WriteLine("facet normal " + xn + " " + yn + " " + zn);
                                sw.WriteLine(" outer loop");
                                for (k = 0; k < IFacet.GetPointsCount(); k++)
                                {
                                    IFacet.GetPoint(k, out x, out y, out z);
                                    sw.WriteLine("vertex " + x + " " + y + " " + z);
                                }
                                sw.WriteLine("endloop");
                                sw.WriteLine("endfacet");
                            }
                        }
                    }
                }
            }
            sw.WriteLine("endsolid");
            sw.Close();
            kompas.ksMessage("redy");
        }

Skorb

Вы насколько я понял получали интерфейс PSurface, я же получаю интерфейс o3d_face, это 2 разных интерфейса

ksEntity и ksFaceDefinition, где Вы проверили?
Хотя код должен работать, чтобы понять Вам нужно в отладчике пройтись и найти проблему.
Вот видео моего кода в отладчике Delphi, если посмотрите, то у меня работает, т.ч. разбирайтесь в отладчике.
https://yadi.sk/d/hBbZrgMCpyd3y

Skorb

А можете объяснить как корректно запустить дебаг, я запускаю программу в режиме дебаг в среде программирования, ставлю точку останова, запускаю библиотеку в компасе и ничего не происходит

Я же писал, что в C# не программирую, т.ч. читайте книги, а до точки останова выполнение кода может не дойти, сработало условие и дальше выполнение не пошло.

По поводу o3d_face смотрите картинку, нет проблемы.

Skorb

А можете проверить Ваш код на любой детали из этой сборки?

Не проблема.

Skorb

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

#34
Код внимательно посмотрите, первые две строки, где тут выделенная поверхность?
Код немного переделал, чтобы по всем граням пробежаться.

Skorb

А нормально ли что программа формирует такой STL? у него практически все нормали одинаковые?

Что, тут ненормального? Направление вектора нормали в любой точке плоской плоскости будет одинаковым.
+ Благодарностей: 1

Skorb

Я доделал функцию и она полностью работает, правда как-то очень криво конвертирует модели, в чем может быть проблема? прилагаю файл с моделью, на которой тестировал и файл STL.

        void Getsurface()
        {
            StreamWriter sw = new StreamWriter("C:\\New1.txt");
            sw.WriteLine("solid");
            ksDocument3D iDocument3D = (ksDocument3D)kompas.ActiveDocument3D();
            ksPartCollection coll = (ksPartCollection)iDocument3D.PartCollection(true);
            ksPart part = (ksPart)coll.GetByIndex(3);
            ksEntityCollection Ientitycol = (ksEntityCollection)part.EntityCollection((short)Obj3dType.o3d_face);
            for (int r = 0; r < Ientitycol.GetCount(); r++)
            {
                ksEntity Ientity = (ksEntity)Ientitycol.GetByIndex(r);
                ksFaceDefinition IFaceDefinition = (ksFaceDefinition)Ientity.GetDefinition();
                ksTessellation ITessellation = (ksTessellation)IFaceDefinition.GetTessellation();
                ksFacet IFacet = (ksFacet)ITessellation.GetFacet();
                float x = 0, y = 0, z = 0;
                float xn = 0, yn = 0, zn = 0;
                int count = 0;
                for (int j = 0; j < ITessellation.GetFacetsCount(); j++)
                {
                    count = 0;
                    ITessellation.GetFacetData(j, IFacet);
                    for (int k = 0; k < IFacet.GetPointsCount(); k++)
                    {
                        if (count == 0)
                        {
                            IFacet.GetNormal(k, out xn, out yn, out zn);
                            sw.WriteLine("facet normal " + xn + " " + yn + " " + zn);
                            sw.WriteLine(" outer loop");
                        }
                        count++;
                        if ((count > 0) && (count < 4))
                        {
                            IFacet.GetPoint(k, out x, out y, out z);
                            sw.WriteLine("vertex " + x + " " + y + " " + z);
                        }
                    }
                    sw.WriteLine("endloop");
                    sw.WriteLine("endfacet");                   
                }
            }
            sw.WriteLine("endsolid");
            sw.Close();
            kompas.ksMessage("redy");
        }

Что, Вы считаете кривым?
Просто мне нечем сейчас STL открыть, я так догадываюсь, что модель получается многогранная и грубая.

Skorb

Да именно так, вот посмотрите как отображается модель, которую я приложил выше