Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
[ Закрыто ] Как найти координаты узла в точке пересечения сплайна и прямой, определение координат точки пересечения сплайна и прямой
 
хочу написать макрос, который будет снимать координатную сетку сложных профилей. это в идеале. для начала пытаюсь написать процедуру определения координат узла в точке пересечения сплайна и прямой. программист из меня не ахти, поэтому испытываю определенные трудности. в частности, не могу понять, что надо в конструкции
IntersectionNode(Model::Document * Doc, Model2D::Construction* srcConstruction1, Model2D::Construction* srcConstruction2);
подставлять вместо Model2D::Construction* srcConstruction1, Model2D::Construction* srcConstruction2
сам-то, может и разобрался бы, но для экономии времени решил спросить здесь :)
 
а не подскажите ли хотя бы, почему при попытке сохранить файл появляется сообщение "Ошибка записи информации о макросах" и как с ним бороться?
 
Вместо Model2D::Construction* srcConstruction1, Model2D::Construction* srcConstruction2 необходимо подставить линии построения. В вашем случае сплайн и прямая. :)
 
ну это понятно, меня интересовало, как именно это сделать, что конкретно писать вместо этого обозначения. но с этим я уже разобрался.
теперь у меня другая проблема: линию я рисую командой макроса, а сплайн у меня должен быть уже готовый, т.е. я должен как-то указать на него... а вот при помощи какого класса это можно сделать, пока не знаю. есть какой-то класс SelectionContainer, но он это или не он, не знаю, еще не пробовал...
 
и, собственно, какой класс отвечает за сплайны? в пространстве имен Model2D есть только класс PathConstruction, а про сплайны я там ничего не нашел. в Model3D есть класс SplineCurve, но это, по-моему, не совсем то...
 
Цитата
drugg пишет:
почему при попытке сохранить файл появляется сообщение "Ошибка записи информации о макросах" и как с ним бороться?

Есть предположение, что у Вас просто старая версия T-Flex. У меня все нормально сохраняется.

Цитата
drugg пишет:
какой класс отвечает за сплайны?

В Е-Flex 10 еще нет возможности работы со сплайнами. Такая возможность появилась только в 11 версии. Поэтому попробуйте поработать с 2D путями (PathConstruction).
Кто ищет - тот всегда найдет!
 
я-то вообще в 9-ке работаю :)
версия-то у меня старая, но все писал в ней с нуля и все сохранялось до определенного момента, а сейчас никак. надо попробовать на другом компьютере, в другой версии. это, в принципе, не критично.
 
drugg пишет в теме http://www.tflex.ru/vhodnaforum/read.php?FID=1&TID=1006&MID=1
Цитата
я, кстати, думал, что если у меня в моем макросе не получится определять координаты узла напрямую, то придется делать так: ставить две перпендикулярные линии в координаты 0,0 и от них снимать размеры до нужного узла. тупо, конечно, но вроде реализуемо

Посмотрите TFlex::Model::Model2D::IntersectionNode, там есть свойства, позволяющие снимать координаты узла, лежащего на пересечении элементов построения напрямую(например по идентификатору ID. Для узлов характерны идентификаторы типа 0x2000001). Можно посмотреть в примерах макросов, поставляемых вместе с T-Flex, как работать с узлами и их координатами. Надеюсь все получится :)
Кто ищет - тот всегда найдет!
 
Цитата
drugg написал:
теперь у меня другая проблема: линию я рисую командой макроса, а сплайн у меня должен быть уже готовый, т.е. я должен как-то указать на него... а вот при помощи какого класса это можно сделать, пока не знаю. есть какой-то класс SelectionContainer, но он это или не он, не знаю, еще не пробовал...
кто-нибудь решал подобный вопрос? Т.е. у меня выполняется какая-то последовательность действий, потом нужно выбрать, к примеру, грань, и потом продолжить работу уже с выбранной гранью. Как реализовать ожидание выбора какого-либо объекта из кода?
 
Цитата
Batarejka написал:

Цитата
drugg написал:
теперь у меня другая проблема: линию я рисую командой макроса, а сплайн у меня должен быть уже готовый, т.е. я должен как-то указать на него... а вот при помощи какого класса это можно сделать, пока не знаю. есть какой-то класс SelectionContainer, но он это или не он, не знаю, еще не пробовал...
кто-нибудь решал подобный вопрос? Т.е. у меня выполняется какая-то последовательность действий, потом нужно выбрать, к примеру, грань, и потом продолжить работу уже с выбранной гранью. Как реализовать ожидание выбора какого-либо объекта из кода?


Ожидание выбора объекта - см. метод Application.PickPoint
 
Алексей, спасибо. Но... или лыжи не едут, или ... Вот похожая проблема, так и оставшаяся без ответа http://tflex.ru/forum/index.php?PAGE_NAME=message&FID=14&TID=2046&TITLE_SEO=2046&MID=17920&tags=&q=S...
Хоть ты тресни, не получается в 3Д модели выбрать грань и продолжить с ней работу.
 
Цитата
Batarejka написал:
Алексей , спасибо. Но... или лыжи не едут, или ... Вот похожая проблема, так и оставшаяся без ответа http://tflex.ru/forum/index.php?PAGE_NAME=message&FID=14&TID=2046&TITLE_SEO=2046&MID=17920&t ags=&q=S...
Хоть ты тресни, не получается в 3Д модели выбрать грань и продолжить с ней работу.
В какой версии программы работа ведётся? В 14-ой версии макрос отлаживался и работает
 
Алексей,работаю в 12-ой версии
 
Цитата
Batarejka написал:
Алексей ,работаю в 12-ой версии
Рекомендую установить 14-ую версию. В 12-ю версию правки не вносились
 
Алексей, спасибо, в 14-ой версии заработало. Теперь новый квест.
Код
var filter = new SelectionFilter();
            filter.DisableAllTypes();
            filter.Enable(ObjectType.Face);
           
            var pickPointParameters = new PickPointParameters {Prompt = "Выберите КТЭ", Filter = filter };
            
            bool point = false;
            PickPointResult pickResult = null;

            while (!point)
            {
                pickResult = TFlex.Application.PickPoint(pickPointParameters);

                if (pickResult.SelectedObject != null)
                {
                    
                        point = true;
                    
                } 
            }

            MessageBox.Show(pickResult.SelectedObject.Name);

Собственно в pickResult у меня теперь хранится объект типа ModelObject. Это грань. Как мне получить геометрию этой грани? Нужны нормаль, точка на грани и тд.
 
Цитата
Batarejka написал:
Собственно в pickResult у меня теперь хранится объект типа ModelObject. Это грань. Как мне получить геометрию этой грани? Нужны нормаль, точка на грани и тд.

Код
...
TopolReference topolRef = pickResult.SelectedObject as TopolReference;
if(topolRef != null)
{
     ModelFace modelFace = topolRef.Topol as ModelFace;
     if(modelFace != null)
     {
          var surf = modelFace.Surface;
          //какая-то точка
          Point3D p = new Point3D(..., ..., ...); 

          var uv = surf.Parameterize(p); // если точка лежит на поверхности
          //var uv = surf.Parameterize2(p); // точка может лежать или не лежать на поверхности. Во втором случае, предварительно определяется точка на поверхности ближайшая к p
          Direction normal = surf.Normal(uv);
          if(modelFace.Sense == false)
          {// требуется инверсия нормали
             normal.X = normal.X * -1.0;
             normal.Y = normal.Y * -1.0;
             normal.Z = normal.Z * -1.0;
          }
          //normal искомая нормаль в точке
     }
}
 
Игорь Батюченко,спасибо огромное!
 
Цитата
Batarejka написал:
Игорь Батюченко,спасибо огромное!
Для информации.
В след. обновлении TFLEX CAD 14 в API добавлена возможность получить UVBox грани, таким образом можно будет получать параметры грани по собственной сетке.
Код
TopolReference topolRef = pickResult.SelectedObject as TopolReference;
if(topolRef != null)
{
     ModelFace modelFace = topolRef.Topol as ModelFace;
     if(modelFace != null)
     {
          var surf = modelFace.Surface;
          var uvbox = modelFace.UVBox;
          const int imax = 10;
          const int jmax = 20;
          for(int i = 0; i < imax; ++i)
          {
             double u = uvbox.LowU + (uvbox.HighU - uvbox.LowU) * (double)(i / imax);
             for(int j = 0; j < jmax; ++j)
             {
                  double v = uvbox.LowV + (uvbox.HighV - uvbox.LowV) * (double)(j / jmax);                
                  UV uv = { u, v };

                  //например параметр "нормаль"
                  Direction normal = surf.Normal(uv);
                  if(modelFace.Sense == false)  
                  {// требуется инверсия нормали
                    normal.X = normal.X * -1.0;
                    normal.Y = normal.Y * -1.0;
                    normal.Z = normal.Z * -1.0;
                  }
                  ...
                  ...
                  ...                
             }
          }
      }

 
Спасибо за информацию. Я немного другим способом сделала:
Код
var topolRef = pickResult.SelectedObject as TopolReference;
            
            if (topolRef != null)
            {
                if (topolRef.IsKindOf(ObjectType.Face))
                {
                    var modelFace = topolRef.Topol as ModelFace;
                    if (modelFace != null)
                    {
                        if (modelFace.Surface is PlaneSurface)
                        {
                            var pSurf = modelFace.Surface as PlaneSurface;
                            var pt1 = pSurf.Plane.Origin;
                            var normal1 = pSurf.Plane.Normal;
                        }

                    }
                }
            }

Без этого if (topolRef.IsKindOf(ObjectType.Face)) все работает отлично, но при проверке, грань ли выбрана (т.к. есть еще возможность выбора ребра и там несколько другие параметры нужны), результат проверки - false.
Изменено: Batarejka - 17.07.2015 12:19:35
 
Цитата
Batarejka написал:
Без этого if (topolRef.IsKindOf(ObjectType.Face)) все работает отлично, но при проверке, грань ли выбрана (т.к. есть еще возможность выбора ребра и там несколько другие параметры нужны), результат проверки - false.
Такая проверка всегда вернет false, потому что TopolReference имеет GroupType - Topol.
Достаточно проверить так
Код
var topol = topolRef.Topol;
var modelFace = topol as ModelFace;
if (modelFace != null)
{ // грань
   ...
}
else
{
   var modelEdge = topol as ModelEdge;
   if (modelEdge != null)
   { // ребро
      ...
   }
}


Страницы: 1