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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 24 След.
Путь по ребрам грани
 
Артем, по видимому решить эту задачу на уровне адаптивного фрагмента будет не просто (если вообще такое возможно). В качестве временного решения, можно использовать макрос для создания/обновления существующих записей в структуре изделия. Но чтобы макрос корректно работал, тела должны иметь однородную структуру зависимостей. Я немного поэкспериментировал и вот что у меня получилось.
[CODE]
using System.Linq;
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Data.ProductStructure;
using TFlex.Model.Model3D;
using TFlex.Model.Model3D.Geometry;

namespace Test
{
   public class ProductStructureHelper
   {
       public static void Run()
       {
           var document = TFlex.Application.ActiveDocument;
           if (document == null)
               return;

           var objects = document.Selection.GetAllObjects();
           if (objects.Length == 0)
           {
               MessageBox.Show("Перед запуском макроса, необходимо выбрать объект!", "T-FLEX CAD");
               return;
           }

           foreach (var obj in objects)
           {
               if (obj.GroupType != ObjectType.Extrusion)
                   continue;
               
               var extrusion = obj as ThickenExtrusion;
               if (extrusion == null)
                   continue;
               
               UpdateProductStructure(document, extrusion);
           }
       }

       private static void UpdateProductStructure(Document document, ThickenExtrusion extrusion)
       {
           foreach (var ps in document.GetProductStructures())
           {
               var scheme = ps.GetScheme();
               if (scheme.Name != "Спецификация")
                   continue;

               var pHelper = new ProcHelper(ps, scheme);
               bool updated = false;

               document.BeginChanges("");

               foreach (var row in ps.GetAllRowElements())
               {
                   if (pHelper.GetName(row).Contains("Сегмент") &&
                       row.ParentRowElement.LinkedObjects.Contains(extrusion))
                   {
                       TaskProcessing(extrusion, pHelper, row, 0);
                       updated = true;
                   }
               }

               if (updated)
               {
                   ps.UpdateStructure();
                   document.EndChanges();
                   return;
               }

               var parentRow = ps.AddElement();
               pHelper.SetName(parentRow, extrusion.Name);
               parentRow.LinkedObjects.Add(extrusion);

               TaskProcessing(extrusion, pHelper, parentRow, 1);
               ps.UpdateStructure();

               document.EndChanges();
           }
       }

       private static void TaskProcessing(ThickenExtrusion extrusion, ProcHelper pHelper, RowElement row, int flag)
       {
           for (int i = 0; i < extrusion.Profile.Length; i++)
           {
               var topolRef = (extrusion.Profile[i] as ModelContour).Reference as TopolReference;
               if (topolRef == null)
                   continue;

               var face = topolRef.Topol as ModelFace;
               if (face == null)
                   continue;

               RowElement _row;

               foreach (ModelEdge edge in face.Edges)
               {
                   var id = edge.Identify;
                   if (flag > 0)
                   {
                       _row = pHelper.ProductStructure.AddElement();
                       _row.ParentRowElement = row;
                   }
                   else
                   {
                       _row = row;
                       if (!pHelper.GetName(_row).Contains(id))
                           continue;
                   }

                   var length = edge.Curve.Length(edge.Interval) * 1000;
                   var value = string.Format("Сегмент [id: {0}, len: {1}]",
                       id, length);

                   pHelper.SetName(_row, value);
               }
           }
       }
   }

   public class ProcHelper
   {
       readonly Scheme scheme;

       public ProcHelper(ProductStructure ps, Scheme scheme)
       {
           this.scheme = scheme;
           ProductStructure = ps;
       }

       public ProductStructure ProductStructure { get; }

       public string GetName(RowElement row)
       {
           foreach (var p in scheme.Parameters)
           {
               if (p.SynonymName == "Description")
               {
                   return row[p].Text;
               }
           }
           
           return null;
       }

       public void SetName(RowElement row, string value)
       {
           foreach (var p in scheme.Parameters)
           {
               if (p.SynonymName == "Description")
               {
                   row[p].Text = value;
                   break;
               }
           }
       }
   }
}
[/CODE]
Целевые объекты обработки -- это тела, созданные при помощи операции "Выталкивание", с привязкой к граням на базовой форме. По сути, макрос создает записи в структуре изделия с привязкой к операции "Выталкивание" для определения родительского элемента. Дочерние элементы не имеют привязку к ребрам, но они идентифицируются по свойству [B]Identify[/B] при повторной обработке записей.
Путь по ребрам грани
 
[QUOTE]Артем написал:
Существует ли способ подсчета отрезков без создания пути?[/QUOTE]
если нужно получить длину с привязкой в структуре изделия, то иного пути нет: либо через измерение, либо через объект построения, типа 3D-путь. Я полагаю, когда создается привязка к ребру через операцию "Измерение", то в дерево модели добавляется новая сущность, которая просто содержит ссылку на ребро. Так что особой разницы нет, какой объект выступает в роли привязки.
Путь по ребрам грани
 
Артем, вы можете получить длину сегментов через привязку к ребрам. Затем, привязать переменные к дочерним элементам в структуре изделия (см. вложение). Привязка геометрического объекта к переменной осуществляется через операцию "Измерение".
Путь по ребрам грани
 
Артем, формально можно получить практически любые данные из модели фрагмента штатными средствами T-FLEX CAD и привязать к структуре изделия, но поскольку прикладная часть задачи не очевидна, то сложно определить пути ее решения. Возможно, применение макроса в данном случае излишне. Необходимость в создании 3D-пути нужно для того, чтобы посчитать длину отрезков и вывести в отчет?
Путь по ребрам грани
 
[QUOTE]Артем написал:
Нашел в коде несколько недочетов, поправил, проверил - РАБОТАЕТ![/QUOTE]
эта проблема связана с редактором макросов. Я все тесты создаю в Visual Studio, а в макросе делаю только вызов метода Run().

Вашу задачу можно решить по селектору, чтобы каждый раз не вводить наименование грани, например:
[CODE]
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model3D;
using TFlex.Model.Model3D.Geometry;

namespace Test
{
   public class PathBuilder
   {
       static readonly Document document = TFlex.Application.ActiveDocument;

       static public void Run()
       {
           if (document == null)
               return;


           var objects = document.Selection.GetAllObjects();
           if (objects.Length == 0)
           {
               MessageBox.Show("Перед запуском макроса, необходимо выбрать грань!", "T-FLEX CAD");
               return;
           }

           foreach (var obj in objects)
           {
               if (obj.GroupType != ObjectType.Topol)
                   continue;

               var face = ((TopolReference)obj).Topol as ModelFace;
               if (face == null)
                   continue;

               CreatePath(face);
           }
       }

       static private void CreatePath(ModelFace face)
       {
           document.Diagnostics.RemoveAll();
           document.BeginChanges("");

           EdgePath path = new EdgePath(document);

           foreach (ModelEdge edge in face.Edges)
               path.Edges.Add(edge);

           document.EndChanges();
           document.Diagnostics.Add(new DiagnosticsMessage(
               DiagnosticsMessageType.Information,
               string.Format("Create Path3D [id: {0}, name: {1}]",
               path.ObjectId,
               path.Name)));
       }
   }
}
[/CODE]
Изменено: vite - 05.02.2021 12:10:41
Путь по ребрам грани
 
Артем, потому что метод [B]Path3D.Create[/B] создает объект типа [B]ReferencePath[/B]. Для построения 3D-пути по ребрам нужно использовать класс [B]EdgePath[/B], просто добавляя в коллекцию ребра, например:

[CODE]
using TFlex.Model;
using TFlex.Model.Model3D;
using TFlex.Model.Model3D.Geometry;

namespace Test
{
   public class PathBuilder
   {
       static readonly Document document = TFlex.Application.ActiveDocument;

       static public void Run()
       {
           if (document == null)
               return;

           Path3D path = null;
           
           document.BeginChanges("");

           foreach (BodyPart bp in document.Bodies)
           {
               if (!(bp.BaseOperation is Block block))
                   continue;

               if ((path = BlockProcessing(block, "Грань_1")) != null)
                   break;
           }

           if (path == null)
               document.CancelChanges();
           else
               document.EndChanges();
       }

       static private EdgePath BlockProcessing(Block block, string faceName)
       {
           foreach (ModelBody body in block.Geometry.Solid)
           {
               foreach (ModelFace face in body.Faces)
               {
                   if (face.Name == faceName)
                   {
                       EdgePath path = new EdgePath(document);

                       foreach (ModelEdge edge in face.Edges)
                       {
                           path.Edges.Add(edge);
                       }

                       return path.Edges.Length > 0 ? path : null;
                   }
               }
           }

           return null;
       }
   }
}
[/CODE]
Изменено: vite - 04.02.2021 16:32:00
Как получить длины участков 3D Пути
 
Артем, на самом деле, можно получить объекты типа [B]Path3D[/B] при помощи метода [B]GetPaths3D[/B]. В API есть много методов для извлечения определенного типа объектов. Обычно задача обработки не сводится к одной операции, поэтому, проще использовать универсальный метод [B]GetObjects[/B].
Как получить длины участков 3D Пути
 
Артем, длина сегмента 3D-пути определяется свойством [B]Path3D.Path3DSegment.Length[/B].

Пример вывода длины сегментов 3D-пути в окно диагностики T-FLEX CAD:
[CODE]
using TFlex.Model;
using TFlex.Model.Model3D;

namespace Test
{
   public class PathReader
   {
       readonly static Document document = TFlex.Application.ActiveDocument;
       
       public static void Run()
       {
           if (document == null)
               return;

           document.Diagnostics.RemoveAll();

           foreach (var obj in document.GetObjects())
           {
               if (obj.GroupType != ObjectType.Path3D)
                   continue;

               var path = obj as Path3D;

               document.Diagnostics.Add(new DiagnosticsMessage(
                   DiagnosticsMessageType.Information,
                   string.Format("Path3D [id: {0}]", path.ObjectId)));

               foreach (var segment in path.Path3DSegments)
               {  
                   document.Diagnostics.Add(new DiagnosticsMessage(
                       DiagnosticsMessageType.Information,
                       string.Format("--> Segment [len: {0}]",
                       segment.Length)));
               }
           }
       }
   }
}
[/CODE]
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Андрей Коржиц, кажется причина сбоя blender при включении ProRender связана с некорректной регистрацией плагина. На форуме AMD есть похожий на вашу проблему запрос.
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Цитата
andreikorzhyts написал:
Поясните, я что-то не могу понять, что вы имеете ввиду. С какой другой ОС?
к windows 10 это не имеет отношение, проблема совместимоти некоторых моделей карт для macOS...
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Цитата
andreikorzhyts написал:
А чего зачёркнуто?
ошибся, это свсзано с другой ОС..., но хотелось бы также понять, почему blender вылетает при переключении на ProRender...
Изменено: vite - 03.12.2020 00:58:48
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
andreikorzhyts, нужно внимательно изучать технически требования (см. Product Compatibility). Вашей карты в списке нет...
Изменено: vite - 02.12.2020 23:33:42
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Цитата
andreikorzhyts написал:
А вам зачем ети эксперименты с Блендером?
если в blender все работает -- это показатель того, что на вашей стороне проблем нет...
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
andreikorzhyts, да, странное поведение, но на снимке видно что рендер работает корректно. Что касается плагина ProRender, как вариант, попробуйте поставить версию blender 2.83 LTS (неуверен, по поводу совместимости файлов, созданных в более поздних версиях приложения, но лучше использовать проекты, созданные в соответствующей версии).

А что с T-FLEX CAD, работает поддержка аппаратного режима?
Изменено: vite - 02.12.2020 23:34:07
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
andreikorzhyts, плагин ProRender работает в blender?
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Цитата
andreikorzhyts написал:
Кстати, по-моему, драйвер для CAD-который он для каких-то Pro карт, а у меня обычная, без Pro.
дело в том, что компания AMD поддерживает два стека драйверов для GPU: первый полностью с отрытым исходным кодом, а второй с приставкой PRO -- является закрытый (проприетарный), который включает расширенные возможности. В отличии от NVIDIA, компания AMD активно принимает участие в развитии графического стека Mesa (открытой реализации OpenGL). Для пользователей windows, по большому счету, не имеет значения, открытый или закрытый драйвер. Но для сообщества Linux -- это имеет принципиальное значение, поскольку большинство дистрибутивов не могут по умолчанию использовать ПО с несовместимой лицензией. По сути, компания AMD открыла только базовую часть реализации драйвера, чтобы получить поддержку от сообщества Linux.
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
andreikorzhyts, стандартный тест безопасный...
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Цитата
andreikorzhyts написал:
Это нужно будет каждый по очереди установить попробовать и удалить?
я думаю что оптимальный вариант -- это драйвер 20.Q4, но прежде можно провести тест с драйвером от производителя. Перед установкой другой версии драйвера, необходимо полностью удалить предустановленный.
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
andreikorzhyts, интересно было бы получить сравнительные тесты производительности вашей видеокарты для различных драйверов, доступных на сайте производителя и сайте AMD. Для проведения сравнительных тестов можно воспользоваться утилитой FurMark.
T-FLEX CAD 17.0.27.0
T-FLEX CAD Учебная версия - зависает при открытии файла
 
Цитата
andreikorzhyts написал:
И с интернетом она свяызывалсь, и такой же драйвер ствила.
К сожалению нет возможности подтвердить то факт, что утилита Auto-Detect загружает именно версию драйвера (WHQL, 17.40.2011), но вот что мне выдает поиск на сайте AMD: radeon-rx-550

если следовать рекомандациям производителя, то версия драйвера (WHQL, 17.40.2011). На сайте AMD доступен драйвер (WHQL) от 11/18/2020. Обратите внимание, что сущестует также драйвер 20.Q4, который предназначен для работы с CAD.
Изменено: vite - 01.12.2020 22:30:02
T-FLEX CAD 17.0.27.0
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 24 След.