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

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

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

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

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

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

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

ksSurfase нет описания метода Tessellation

Автор Konstantin123, 08.10.13, 22:32:00

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

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

Konstantin123

В SDK написано, что в интерфейсе ksSurface есть метод Tesselation, а на деле оказалось его нет.

Ошибка   4   "Kompas6API5.ksSurface" не содержит определения для "Tessellation" и не был найден метод расширения "Tessellation", принимающий тип "Kompas6API5.ksSurface" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)   D:\Новая папка\Step3d1.cs   165   72   STLExample

Подскажите как быть и как можно получить интерфейс ksTesselation?

Можно получить от грани.
pTessellation:=IUnknown(pFaceDefinition.GetTessellation) as ITessellation;

Konstantin123

Спасибо, но возникло несколько других вопросов.

ksFacet IFacet = (ksFacet)ITessellation.GetFacet();
                   float x = 1, y = 2, z = 3;
                   for (j = 0; j < ITessellation.GetFacetsCount(); j++)
                   {
                       int k = 0;
                       if (ITessellation.GetFacetData(j, IFacet))
                       {


                           kompas.ksMessage("facet no " + j);
                           for (k = 0; k < IFacet.GetPointsCount(); k++)
                           {

                               if (IFacet.GetPoint(k, x, y, z))
                                   kompas.ksMessage("x" + k + "=" + Convert.ToString(x) + " y" + k + "=" + Convert.ToString(y) + " z" + k + "=" + Convert.ToString(z));
                               else
                                   kompas.ksMessage("points oblom");
                           }
                       }
                       else
                           kompas.ksMessage("fasetdata oblom");

                   }

точки x,y и z всегда имеют значения 1,2,3, ну или любые другие, которые я задам в начале. Похоже, что метод Getpoint работает не верно или я его не верно использую. Подскажите как получить данные о фасете?

09.10.13, 11:43:03 #3 Последнее редактирование: 09.10.13, 14:08:23 от Sabahs
Я получал два вариантных массива функцией GetFacetPoints и работал с ними.
Пример смотрите здесь SDK\C++\Visualc\Cube\cFrameEvent.cpp
Хотя работает и без массивов pTessellation.GetPoint(I,X,Y,Z);, но перед этим устанавливал ограничение размера ребра для триангуляционной пластины pTessellation.SetFacetSize.

Konstantin123

09.10.13, 14:33:27 #4 Последнее редактирование: 09.10.13, 14:44:46 от Konstantin123
В c# ругается в методе GetFacetPoints на массив вариантов, требуя ref object. Было бы не плохо все-таки подключиться к ksFacet и использовать GetPoint так как он имеет простые типы данных. Возможно ли это или на самом деле интерфейс IFacet не рабочий а в справке описан для галочки в отчетности?

pTessellation.GetPoint(I,X,Y,Z) так же не изменяет значения x,y,z а просто пишет то, что было задано по умолчанию.
Может я что-то делаю не так и эти методы работают как-то иначе?

int j = 0;
                   float x = 1, y = 2, z = 3;
                   for (j = 0; j < ITessellation.GetPointsCount(); j++)
                   {                     
                       ITessellation.GetPoint(j,x,y,z);
                                   kompas.ksMessage("x" + j + "=" + Convert.ToString(x) + " y" + j + "=" + Convert.ToString(y) + " z" + j + "=" + Convert.ToString(z));                             

                   }

вот этот участок кода перебирает все точки и пишет x0=1 y0=2 z0=3 и меняется только индекс у координат а координаты всегда остаются 1 2 3 так же было и с интерфейсом ksFacet.



Прошу прощенья. Решил проблему. Все дело оказалось в том, что я не указал, что x,y,z это указатели. Вот я и получал значения тех переменных, которые задал. Спасибо за помощь.

А чем Вас не устраивает ksTessellation::GetPoint?
Имеет простые типы данных, тех же точек.

Konstantin123

Спасибо. Со всем разобрался. Я просто неверные параметры в GetPoint передавал, от этого и не работал корректно.
Вот код на c# генерации файла STL с пометками выбранных поверхностей тела, если кому понадобится ради примера посмотреть.


void Choosesurface()
        {
            System.IO.StreamWriter sw = new System.IO.StreamWriter("D:\\New1.txt");
            sw.WriteLine("solid");                   
            int i=0;
            ksDocument3D iDocument3D = (ksDocument3D)kompas.ActiveDocument3D();
            ksPart IPart = (ksPart)iDocument3D.GetPart((short)Part_Type.pTop_Part);
            ksEntityCollection Ientitycol = (ksEntityCollection)IPart.EntityCollection((short)Obj3dType.o3d_face);
            kompas.ksMessage("Surfaces - "+Convert.ToString(Ientitycol.GetCount()));
           

           ksSelectionMng ISelect = (ksSelectionMng)iDocument3D.GetSelectionMng();
           kompas.ksMessage("Chosen surfaces - "+Convert.ToString(ISelect.GetCount()+" type "+Convert.ToString(ISelect.GetObjectType(0))));

           for (i = 0; i < ISelect.GetCount(); i++)
           {
               ksEntity Ientity = (ksEntity)ISelect.GetObjectByIndex(i);
               Ientity.name = "inner surface";
               
           }
           for (i = 0; i < Ientitycol.GetCount(); i++)
           {
               
               ksEntity Ientity = (ksEntity)Ientitycol.GetByIndex(i);
               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,ref xn,ref yn,ref 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");
                      // str+="facet normal "+xn+" "+yn+" "+zn+"\n outer loop \n";
                       for (k = 0; k < IFacet.GetPointsCount(); k++)
                       {
                           IFacet.GetPoint(k, ref x, ref y, ref z);
                           sw.WriteLine("vertex " + x + " " + y + " " + z );
                           
                       }
                       sw.WriteLine("endloop");
                       sw.WriteLine("endfacet");
                       
                               

                   }
               
                   
           }
           sw.WriteLine("endsolid");                     
           sw.Close();         
           
         
           kompas.ksMessage("redy");
           
        }