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

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

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

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

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

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

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

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

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

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

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

Skorb

Добрый вечер, у меня такой вопрос, есть сборка, в которой относительно не много деталей, я получаю список деталей в сборке и хочу для каждой из них сгенерировать свой STL-файл. При выполнении данного кода вылетает ошибка: "Ошибка при получении параметров триангуляции". Подскажите пожалуйста, что не так. Для написания кода использовал язык C#.


void Getsurface()
        {
            ksPartCollection coll = (ksPartCollection)doc.PartCollection(true);
            ksPart part = (ksPart)doc.GetPart(0);
            StreamWriter sw = new StreamWriter("C:\\New1.txt");
            sw.WriteLine("solid");
            int r = 0;
            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();
                //ITessellation.SetFacetSize(1);           
                int j = 0;
                int k = 0;
                ksFacet IFacet = (ksFacet)ITessellation.GetFacet();
                float x = 1, y = 2, z = 3;
                float xn = 1, yn = 2, zn = 3;
                for (j = 0; j < ITessellation.GetFacetsCount(); j++)
                {
                    ITessellation.GetFacetData(j, IFacet);
                    IFacet.GetNormal(j, out xn, out yn, out zn);
                    if (Ientity.name == "inner surface")
                    {
                        sw.WriteLine("facet name inner surface");
                        sw.WriteLine("normal " + xn + " " + yn + " " + zn);
                    }
                    else
                        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

Да, я там уже смотрел, тот код работает без ошибок, но дело в том, что там "генерация файла STL с пометками выбранных поверхностей тела", а мне нужно без этого, без использования  ksSelectionMng

Можно ошибку в картинках посмотреть?
Эту строку if (Ientity.name == "inner surface"), в Вашем коде,я не понимаю.

Skorb

Да, убрал ту строчку, она действительно не нужна, ситуацию это не изменило. Картинку с ошибкой приложил.


void Getsurface()
        {
            ksPartCollection coll = (ksPartCollection)doc.PartCollection(true);
            ksPart part = (ksPart)doc.GetPart(0);
            StreamWriter sw = new StreamWriter("C:\\New1.txt");
            sw.WriteLine("solid");
            int r = 0;
            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 = 1, y = 2, z = 3;
                float xn = 1, yn = 2, zn = 3;
                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");
        }

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

PS. coll - зачем получен?
       doc - где получен и как?

Skorb

doc у меня получен вот так:

private ksDocument3D doc;
doc = (ksDocument3D)kompas.ActiveDocument3D();


А сoll это я получаю коллекцию деталей в сборке, чтобы потом обращаться к конкретной детали вот так:

ksPart part = (ksPart)doc.GetPart(0);

0,1,2... это номер детали в сборке. Документ получен также, как и в том коде.

Skorb

Проверку вот такую делаю

if (doc != null)
            {
                if (doc.IsDetail())
                {
                    kompas.ksError("Должна быть сборка");
                }

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)iDocument3D.GetPart(0); если в этой строчке писать ksPart part =(ksPart)iDocument3D.GetPart((short)Part_Type.pTop_Part); то все делается нормально, правда в выходном файле получается 2 строчки solid и endsolid
            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 = 1, y = 2, z = 3;
                float xn = 1, yn = 2, zn = 3;
                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");
        }

Попробуйте, так - Index должен быть в цикле коллекции сборки.
ksPartCollection coll = (ksPartCollection)doc.PartCollection(true);
for ...
ksPart part = (ksPart)coll.GetByIndex(Index);


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);
            for (int p = 0; p < coll.GetCount(); p++)
            {
                ksPart part = (ksPart)coll.GetByIndex(p);

                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 = 1, y = 2, z = 3;
                    float xn = 1, yn = 2, zn = 3;
                    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");
        }


результат тот же :~

IFacet.GetNormal(j, out xn, out yn, out zn);
IFacet.GetPoint(k, out x, out y, out z);
Попробуйте out заменить на ref.

Skorb

Пишет: аргумент должен передаваться ключевым словом out

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

Skorb

Вот

Замечательно, а теперь можете показать точку останова, с ошибкой на картинке и значения переменных в момент вызова.

Skorb

Извините, не совсем понял как это сделать

Skorb

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

Skorb

Причем вот еще в чем дело, сообщение redy библиотека выводит, а это значит функция выполняется я так понимаю полностью, и уже после него выводится сообщение об ошибке триангуляции

Да, у Вас проверок нет, и возможно на каком то этапе функция возвращает нулевой указатель.
Поставьте точку останова и в пошаговом режиме отработайте функцию, с просмотром получаемых значений, визуально вроде ошибок нет, а в отладчике, есть возможность их найти.