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

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

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

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

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

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

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

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

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

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

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

Поменяйте ограничение размера ребра для триангуляционной пластины.
pTessellation.SetFacetSize

Skorb

Модель стала лучше но совсем не намного

Skorb

Вот при таком коде при ITessellation.SetFacetSize(6) выдает рисунок.

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();
                ITessellation.SetFacetSize(6);
                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");
        }

10.03.16, 14:38:52 #43 Последнее редактирование: 10.03.16, 15:25:27 от Sabahs
Я делаю так:
pSurface.GetGabarit(X,Y,Z,U,DU,V);
DV:=sqrt(abs((X-U)*(X-U))+abs((Y-DU)*(Y-DU))+abs((Z-V)*(Z-V)));
pTessellation.SetFacetSize(DV*0.1);
Определяю габарит поверхности и устанавливаю процент от габарита, в данном случае 10%, Вам нужно меньше, DV*0.01 - 1%.
На картинке размер составляет 2% от габарита поверхности.

Skorb

К сожалению не помогло :~

       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);
            double x1 = 0, y1 = 0, z1 = 0, x2 = 0, y2 = 0, z2 = 0, res = 0;
            for (int r = 0; r < Ientitycol.GetCount(); r++)
            {
               
                ksEntity Ientity = (ksEntity)Ientitycol.GetByIndex(r);
                ksFaceDefinition IFaceDefinition = (ksFaceDefinition)Ientity.GetDefinition();
                ksSurface surface = (ksSurface)IFaceDefinition.GetSurface();
                surface.GetGabarit(out x1, out y1, out z1, out x2, out y2, out z2);
                res = Math.Sqrt(Math.Abs((x1 - x2) * (x1 - x2)) + Math.Abs((y1 - y2) * (y1 - y2)) + Math.Abs((z1 - z2) * (z1 - z2)));
                ksTessellation ITessellation = (ksTessellation)IFaceDefinition.GetTessellation();
                ITessellation.SetFacetSize(Convert.ToDouble(res * 0.01));
                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 получаете? У вас проблемы из-за совпадающих граней разных деталей скорее всего. Слайсер с ума сходит. Попробуйте для каждой детали из сборки индивидуально получить.

В коде получает от конкретной детали.
ksPart part = (ksPart)coll.GetByIndex(3);
Сохраните Компасом STL и посмотрите разницу.

Цитата: Sabahs от 10.03.16, 16:29:42
В коде получает от конкретной детали.
А настройки точности в коде есть?

ITessellation.SetFacetSize(Convert.ToDouble(res * 0.01));

Цитата: Sabahs от 10.03.16, 16:56:07
ITessellation.SetFacetSize(Convert.ToDouble(res * 0.01));
А какой это параметр из трех? Судя по всему последний - максимальная длина ребра. Возможно скругления неочень хорошо обрабатывает, там максимальное угловое отклонение больше подходит.


Skorb

Когда я компасом сохраняю в stl, то все нормально

Ладно, будет настроение, и время сделаю проверку, что Компас правильно выдаёт точки и можно самостоятельно сформировать STL файл, но это будет на следующей неделе, сейчас нужно вы фрезеровать шесть моделей для литья, ESPRIT тяжко считает, а без полной симуляции на станок программу я не могу кинуть, инструмент и станок дорогой.
+ Благодарностей: 1

Утром делать нечего было, пока просыпался написал свой генератор STL.
Во вложении болт записан с 1% от габарита поверхности.
+ Благодарностей: 1

Skorb

Спасибо большое, а можете код приложить?

Код.
+ Благодарностей: 1

Skorb

сделал как у вас и не получается все-равно :(

        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);
            double x1 = 0, y1 = 0, z1 = 0, x2 = 0, y2 = 0, z2 = 0, res = 0;
            for (int r = 0; r < Ientitycol.GetCount(); r++)
            {
                ksEntity Ientity = (ksEntity)Ientitycol.GetByIndex(r);
                ksFaceDefinition IFaceDefinition = (ksFaceDefinition)Ientity.GetDefinition();
                if (IFaceDefinition != null)
                {
                    ksSurface surface = (ksSurface)IFaceDefinition.GetSurface();
                    ksTessellation ITessellation = (ksTessellation)IFaceDefinition.GetTessellation();
                    if ((ITessellation != null) && (surface != null))
                    {
                        surface.GetGabarit(out x1, out y1, out z1, out x2, out y2, out z2);
                        res = Math.Sqrt(Math.Abs((x1 - x2) * (x1 - x2)) + Math.Abs((y1 - y2) * (y1 - y2)) + Math.Abs((z1 - z2) * (z1 - z2)));
                        ITessellation.SetFacetSize(Convert.ToDouble(res * 0.1));
                        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 (k == 0)
                                {                                   
                                    IFacet.GetNormal(k, out x, out y, out z);
                                    sw.WriteLine("facet normal " + x + " " + y + " " + z);
                                    sw.WriteLine("outer loop");
                                }
                                IFacet.GetPoint(k, out xn, out yn, out zn);
                                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("ready");
        }

Сделали Вы не так, как у меня.
На картинке, мой и Ваш файл, можете сравнить.

Skorb

но я же формирую STL из болта, который находится в сборке, поэтому и расходятся координаты, Вы видно формируете из болта, как отдельной модели?

Алхимик

Что вам мешает написать, для начала, код для "идеального" процесса? :shu: