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


Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
ЛКС как переменная
 
Доброго времени суток!
Столкнулся с проблемой задания переменной системой координат для фрагмента.
Краткое описание задачи:
Есть сборка содержащая огромное кол-во деталей. Детали привязываются к ЛКС какой-то другой детали, или к ЛКС созданной в сборке, в зависимости от заданных параметров.
В T-flex есть возможность задания имени ЛКС, но при вставке фрагмента (а так же в его свойствах) нельзя задать переменной начальную систему координат, к которой будет привязываться фрагмент.
Я не смог найти информацию по данной проблеме в справочной литературе.

Вопрос: В T-Flex нет возможности задания начальной системы координат привязки фрагмента через переменную?

В принципе пути и алгоритмы решения данной задачи есть - создание нескольких (7-12) переменных для каждого фрагмента и пересчета их значений при каждом изменении. Но это проблематично, т.к. число фрагментов в сборке может быть весьма велеко (более 500), а значит требуется создать более 3500 переменных и выражений для них, не запутаться, и при перестроении ждать пересчета...
 
Переменного названия нет ни для лск, ни для любой другой геометрии, предлагалось и не раз подобное. Такие задачи решаются через 3 переменных одной лск, тобишь координат х, у, z.
Ушёл остывать)
 
Sila Musli,
Ясно, очень жаль. Спасибо за информацию.

Ваш метод я и имел ввиду:

3 переменные (координаты) для привязки фрагмента по координатам в сборке.
+3 переменные для привязки следующего фрагмента (т.к. геометрия фрагментов так же переменна)
+ как минимум 1 переменная для идентификации фрагмента в сборке...
Изменено: Plitkorez - 24.01.2015 23:17:48
 
Цитата
Plitkorez написал:
3 переменные (координаты) для привязки фрагмента по координатам в сборке.
+3 переменные для привязки следующего фрагмента (т.к. геометрия фрагментов так же переменна)
+ как минимум 1 переменная для идентификации фрагмента в сборке...
В каждой конкретной задаче, может быть и больше переменных и меньше.
Я всегда делаю лск от 3д точки, так что у меня при таком способе количество переменных не возрастает, не уменьшается.
Стараюсь если геометрия слишком разная, делать отдельный фрагмент, который будет со своей лск всегда в одном положении относительно своей геометрии, а если геометрия не сильно меняется, то и лск относительно геометрии не меняется, то и 3д точку, можно ставить на плоскости относительно 2д геометрии, но переменных больше или меньше не станет.
Ушёл остывать)
 
Sila Musli, и я придерживаюсь этого же подхода.
Но в данной задаче 3 координатами не обойтись. так как траектория геометрии фрагментов может изменяться во всех плоскостях по зависимостям не описываемым в сборке (внутри выражений переменных фрагмента), поэтому логичней создать еще 3 переменных (координаты) для привязки следующего фрагмента, а не высчитывать их в сборке. Также в сборке не предопределено какой фрагмент привязывается к какому, а так же существуют ответвления, поэтому так же не обходимы переменные, определяющие от какого фрагмента, и от какой заданной точки брать привязочные координаты. Вот и выходит как минимум 7 переменных.

Следующий вопрос по данной теме:

Уверен привязку по переменной через ЛКС можно осуществить через Open API.
Ни как не доходят руки до изучения. Видимо сейчас тот момент. Еще в школе изучал Pascal и Delphi - писал довольно интересные "программки" в плане математики и геометрии, но с данной технологией не сталкивался.
В справке в основном описания функций, возможностей. Так же нашел несколько примеров - повторить и не много вникнуть удалось, но все равно не хватает базовых знаний для программирования на данных языках, и принципов Open API. Справка - скорее описание процедур, функций, возможностей. Может кто-то подскажет - обучающую литературу, а может и пример для моей задачи?
 
Цитата
Plitkorez написал:
Следующий вопрос по данной теме:

Уверен привязку по переменной через ЛКС можно осуществить через Open API.
Пример могу сделать, уточните, чего Вы хотите? Создать ЛСК на основе переменных, далее установить 3D фрагменту эту ЛСК как целевую? Или явно установить нужное положение 3D фрагменту с помощью переменных?
 
Игорь Батюченко, В упрощенном варианте не обходимо реализовать следующее:
Есть сборка содержащая, скажем 3 фрагмента: труба, отвод, тройник. Не обходимо реализовать следующие варианты: Тройник-отвод-труба, Тройник- труба- отвод, Тройник-к одному концу труба, ко второму труба. Ну и многие другие вариации...
Еще раз уточню: привязку через переменные (координаты) реализовать не проблема. Не обходимо осуществлять привязку через переменные системы координат. ЛКС, к которым не обходимо привязывать следующий фрагмент, находится внутри предыдущего фрагмента, причем их там может находиться несколько. Как выяснилось стандартными возможностями T-flex этого (переменная ЛКС) реализовать нельзя. Поэтому сейчас предполагается реализация через Open API.

Буду очень благодарен, за предоставление примера!
Изменено: Plitkorez - 25.01.2015 20:45:10
 
Цитата
Plitkorez написал:
Есть сборка содержащая, скажем 3 фрагмента: труба, отвод, тройник. Не обходимо реализовать следующие варианты: Тройник-отвод-труба, Тройник- труба- отвод, Тройник-к одному концу труба, ко второму труба. Ну и многие другие вариации...
1. Можно использовать технологию SMART-фрагментов. (При вставке фрагмента(удалении, редактировании), будет запущен макрос, описанный вами в документе фрагмента)
Вам необходимо выработать некоторые правила в именование ЛСК, чтобы проще было манипулировать данными ЛСК в макросе.

Поиск коннектора(ЛСК) и переменных(если нужно) в 3D фрагменте(псевдокод C#):
Код
using System;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.Collections.Generic;

using TFlex;
using TFlex.Model.Model3D;
using TFlex.Model.Model3D.Geometry;
using TFlex.Command;
using System.Diagnostics;

 // Ключевые имена переменных и объектов
        private const string varConnectorIn1 = "C_In1"; // входной коннектор главного направления
        private const string varConnectorOut1 = "C_Out1"; // выходной коннектор главного направления
        private const string varConnectorIn2 = "C_In2"; // входной коннектор альтернативного направления
        private const string varConnectorOut2 = "C_Out2"; // выходной коннектор альтернативного направления
        private const string varDiameterIn1 = "DiameterIn1"; // входной диаметр главного направления, переменная
        private const string varDiameterIn2 = "DiameterIn2"; // входной диаметр альтернативного направления, переменная
        private const string varDiameterOut1 = "DiameterOut1"; // выходной диаметр главного направления, переменная
        private const string varDiameterOut2 = "DiameterOut2"; // выходной диаметр альтернативного направления, переменная
        private const string varDefaultSourceLCS1 = "LCS_1"; // общий случай: ЛСК привязки фрагмента по умолчанию


        public void Initialize(bool bReInit)
        {   // сбрасываем актуальность данных
            if (bReInit)
            {
                m_Fragment.Regenerate(true);
                m_defaultLcs = m_Fragment.GetDefaultLCS();
            }
            // собираем информацию о коннекторах
            FindConnectors();
            // собираем переменные
            FindVariables();
        }

        private void FindVariables()
        {
            // извлекаем переменные фрагмента
            m_DiameterIn1 = Fragment.GetVariableValue(varDiameterIn1, !m_bReadOnly);
            m_DiameterOut1 = Fragment.GetVariableValue(varDiameterOut1, !m_bReadOnly);
            m_DiameterIn2 = Fragment.GetVariableValue(varDiameterIn2, !m_bReadOnly);
            m_DiameterOut2 = Fragment.GetVariableValue(varDiameterOut2, !m_bReadOnly);
        }

        private void FindConnectors()
        {
            var refObjects = m_Fragment.Reference;
            QuickFindConnectors(refObjects);
            if (IsFindConnectors() == false)
            {
                FullFindConnectors(refObjects);
            }
        }

         // найдены все коннекторы
        private bool IsFindConnectors()
        {
            return ConnectorIn1 != null && ConnectorIn2 != null && ConnectorOut1 != null && ConnectorOut2 != null;
        }

        // быстрый поиск коннекторов по имени
        private void QuickFindConnectors(References refObjects)
        {
            object refObject = refObjects.FindByName(varConnectorIn1);
            if (refObject != null && refObject is ReferenceLCS)
            {
                m_connectorIn1 = (ReferenceLCS)refObject;
            }
            refObject = refObjects.FindByName(varConnectorOut1);
            if (refObject != null && refObject is ReferenceLCS)
            {
                m_connectorOut1 = (ReferenceLCS)refObject;
            }
            refObject = refObjects.FindByName(varConnectorIn2);
            if (refObject != null && refObject is ReferenceLCS)
            {
                m_connectorIn2 = (ReferenceLCS)refObject;
            }
            refObject = refObjects.FindByName(varConnectorOut2);
            if (refObject != null && refObject is ReferenceLCS)
            {
                m_connectorOut2 = (ReferenceLCS)refObject;
            }
        }

        // полный поиск коннекторов по имени, с учетом подсборок
        private void FullFindConnectors(References refObjects)
        {
            // строим хэш информацию об именах коннекторов
            int hashNameConnectorIn1 = varConnectorIn1.GetHashCode();
            int hashNameConnectorOut1 = varConnectorOut1.GetHashCode();
            int hashNameConnectorIn2 = varConnectorIn2.GetHashCode();
            int hashNameConnectorOut2 = varConnectorOut2.GetHashCode();
            // смотрим список элементов фрагмента
            foreach (var refObject in refObjects)
            {
                if (refObject is ReferenceLCS)
                {
                    ReferenceLCS refLCS = (ReferenceLCS)refObject;
                    string fullName = refLCS.Name;
                    int index = fullName.LastIndexOf("\\") + 1;
                    int hashNameObject = fullName.Substring(index).GetHashCode();
                    if (m_connectorIn1 == null && hashNameObject == hashNameConnectorIn1)
                        m_connectorIn1 = refLCS;
                    if (m_connectorOut1 == null && hashNameObject == hashNameConnectorOut1)
                        m_connectorOut1 = refLCS;
                    if (m_connectorOut2 == null && hashNameObject == hashNameConnectorOut2)
                        m_connectorOut2 = refLCS;
                    if (m_connectorIn2 == null && hashNameObject == hashNameConnectorIn2)
                        m_connectorIn2 = refLCS;
                    if (m_connectorIn1 != null && m_connectorOut1 != null && m_connectorOut2 != null && m_connectorIn2 != null)
                        break;
                }
            }
        }


Установка исходной и целевой системы координат для 3D фрагмента (псевдокод C#):
Код
string strFragmentDefaultLCS = fragment.GetDefaultLCS(); // имя исходной системы координат может отличаться о заданной по умолчанию
Fragment.FixByFragmentLCS( strFragmentDefaultLCS, targetLCS);
 
Цитата
Игорь Батюченко написал:
Можно использовать технологию SMART-фрагментов.
А можно пример использования такого макроса на видео или файлами? А то я как не думал как переменная лск уменьшит количество переменных для ТС, так и не придумал (ну если только ставить лск от 3д геометрии, но для меня это не вариант и всё равно это ускорит, но не уменьшит количество переменных, но может повлечь за собой другие проблемы). Вот теперь этот макрос. При вставке смарт объектов он наверное и помогает(красиво смотрится), но в быту для простых деталей(не для библиотечных) мне кажется усложняет и увеличивается время на создание таких фрагментов, но это мнение скорее из-за незнания. Хотелось бы услышать мнение специалистов, возможно создать отдельную ветку на форуме, посвящённую смарт-объектам, где будет показано-рассказано-разжевано. А мы будем двигать эту технологию в массы и показывать очередное преимущество системы.
Ушёл остывать)
 
Цитата
Sila Musli написал:
А можно пример использования такого макроса на видео или файлами?
Пример про SMART-фрагменты


Видео про библиотеки фитингов:
 
Игорь Батюченко, Спасибо огромное!
То что нужно! Буду разбираться что к чему.
Страницы: 1