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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
2D: Измерение расстояний, Как измерить расстояние от оси до сплайна
 
Господа, здравствуйте!

Подскажите, как программно измерить расстояния от оси ординат (Y) до НАРИСОВАННОГО в tFlex сплайна. Т.е. получить что то типа таблично заданной функции F(X) = Y

Я предполагаю такой подход: Строю линию построения с нужным шагом параллельно оси Х. Нахожу узел на пересечении сплайна и линии построения. Узнаю координату X узла. Удаляю линию построения и узел. И далее о кругу.

Собственно вопрос как найти узел на пересечении сплайна и линии построения. - ткните в метод.
Сплайн будет рисоваться НЕ программно - как его найти в API?

Спасибо.
 
Вот это подойдет?
IntersectionNode(Model::Document * Doc, Model2D::Construction* srcConstruction1, Model2D::Construction* srcConstruction2);

Описание
Конструктор, задающий линии построения, на пересечении которых находится узел
Сюда сплайн скормить можно? Что создаёт этот конструктор?

Если можно - пример использования. А tflexapi.chm настолько емкие описания....
 
Код
Document document = TFlex.Application.ActiveDocument;
         
         ModelObject FO1 = document.GetObjectByID(0x100001F);
         document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,FO1.ID.ToString()));
      
         ModelObject FO2 = document.GetObjectByID(0x100001B);
         document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,FO2.ID.ToString()));
         
         IntersectionNode IN = new IntersectionNode(document, FO1, FO2);
         document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,IN.AbsX.ToString()));
         document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,IN.AbsY.ToString()));


IntersectionNode - просит параметром "construction" - а как его найти?
Я нашёл только TFlex::Model::ModelObject.
Как найти TFlex::Model::Model2D::Construction?
 
Код
         Document document = TFlex.Application.ActiveDocument;
         
Construction FO1;
Construction FO2;
document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,"---"));
foreach(Construction CO in document.Constructions) {

if (CO.ID == 0x100001F) {FO1 = CO; document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,FO1.ID.ToString()));}
if (CO.ID == 0x100001B) {FO2 = CO; document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,FO2.ID.ToString()));   }

}
   
   IntersectionNode IN = new IntersectionNode(document, FO1, FO2);
   document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,IN.AbsX.ToString()));
   document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,IN.AbsY.ToString()));   
    
   


Какого компилятор ругается вот здесь: IntersectionNode IN = new IntersectionNode(document, FO1, FO2);
Компиляция...
'Модуль 1' (36,55) : ошибка CS0165: Использование локальной переменной 'FO1', которой не присвоено значение
'Модуль 1' (36,60) : ошибка CS0165: Использование локальной переменной 'FO2', которой не присвоено значение
Изменено: Александр Смок - 30.11.2010 08:18:43
 
Может быть компилятор ругается потому что переменные FO1 и FO2 в некоторых случаях не проинициализированы (в случае если не сработает хотя бы одно из условий в цикле), попробуйте при объявлении переменных проинициализировать их.


Document document = TFlex.Application.ActiveDocument;

Construction FO1=null;//инициализируем
Construction FO2=null;
document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information, "---"));
foreach (Construction CO in document.Constructions)
{
if (CO.ID == 0x100001F) { FO1 = CO; document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information, FO1.ID.ToString())); }
if (CO.ID == 0x100001B) { FO2 = CO; document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information, FO2.ID.ToString())); }
}

//если значение не было присвоено, ничего не делаем иначе:
if (FO1 != null && FO2 != null)
{
IntersectionNode IN = new IntersectionNode(document, FO1, FO2);
document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information, IN.AbsX.ToString()));
document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information, IN.AbsY.ToString()));
}


как-то так)))
 
Спсибо. Я тоже до этого дошёл. Но не проверил - всё дома.
С# - очень весёлый язык. Трудно на него переходить. Но ничего - ещё пару недель и будет как родной. ;-) наверное.

Сложнее с tFlexAPI...
Вот есть у объекта свойство Имя. Как задать его программно примерно понятно.
Как задать его на чертеже?
 
Я с C# уже 3 год...он мне родной))...сложнее с TFLEX)) с ним я только пару дней, НО АПИ функционал уже оценил, особенно "полноту" справки и ОГРМНОЕ наличие примеров))
А если ближе к телу...с чертежами вообще дел не имел..так что...
Вообще с TFLEX связался только потому что отправил резюме в одну фирму мне дали задачку:

1. Необходимо пройти по дереву фрагментов (дерево отображается
слева в окне 3D модели), собрать данные для спецификации из всех элементов
во всех уровнях дерева, с учетом параметрического функционала T-Flex
2. И вывести в отдельную форму отчета в T-Flex и в файл Word/Excel

Если решу - шансы получить работу увеличаться))
С точки зрения программирования примерно представляю как ее рашать...НО нехватка знаний в области TFLEX сказывается))

Может посоветуйте что-нить?))
 
Цитата
С# - очень весёлый язык. Трудно на него переходить.
А кто вам мешает использовать Visual Basic?
 
В топку VB, шарп гораздо грациозней и развивается лучше в рамках VS
 
Ура, есть живые люди!
Ну это уж совсем не по теме: VB мне нравится ещё меньше, а ещё меньше autolisp.
 
Цитата
fan пишет:

В топку VB, шарп гораздо грациозней и развивается лучше в рамках VS
Это сугубо личные предпочтения. Нет в C# никаких грандиозных возможностей(по сравнению с VB), что бы кричать о топке.
 
Давайте по теме.

Разъясните мне, pls, что будет результатом IntersectionNode IN = new IntersectionNode(document, FO1, FO2);

Ведь на чертеже линии построения уже есть и узел есть тоже.

Что есть IN на самом деле? Ссылка существующий на узел. Или новый узел. Или....
 
Цитата
Александр Смок пишет:

Подскажите, как программно измерить расстояния от оси ординат (Y) до НАРИСОВАННОГО в tFlex сплайна.

С точки зрения способа реализации существует такой вариант: строите ручками узел на сплайне, задавая коэффициент от 0 до 1 относительно его "начала", опрелеляете линейные координаты узла, изменяете коэффициент и по кругу... Узел всегда будет на сплайне.
Изменено: Brom25 - 30.11.2010 19:28:31
Кто ищет - тот всегда найдет!
 
Цитата
fan пишет:

И вывести в отдельную форму отчета в T-Flex и в файл Word/Excel

Есть стандартные макросы по работе со спецификацией, кое-что можно почерпнуть из них, в том числе и экспорт в Excel.
Изменено: Brom25 - 30.11.2010 19:32:18
Кто ищет - тот всегда найдет!
 
Цитата
Brom25 пишет:
С точки зрения способа реализации существует такой вариант: строите ручками узел на сплайне, задавая коэффициент от 0 до 1 относительно его "начала", опрелеляете линейные координаты узла, изменяете коэффициент и по кругу... Узел всегда будет на сплайне.
Спасибо. Интересно. Про существование коэффициента не знал.
Единственное что этим методом точный шаг по Y сложнее получить.
Но это не беда, т.к.
Код
IntersectionNode IN = new IntersectionNode(document, FO1, FO2); 
document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,IN.Coordinates.X.ToString()));
   document.Diagnostics.Add(new DiagnosticsMessage(DiagnosticsMessageType.Information,IN.Coordinates.Y.ToString()));   

всегда возвращает координаты 0,0 в не зависимости от переданных в конструктор линий построения. :(
Изменено: Александр Смок - 01.12.2010 07:53:00
 
Заработало!!!
Необходимо после

IntersectionNode IN = new IntersectionNode(document, FO1, FO2);

вызвать

document.EndChanges();

и только ПОСЛЕ ЭТОГО обращатся к свойствам IN

иначе болт!
Страницы: 1