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


Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
Получение родительского объекта, Как получить объект-родитель для заданного объекта
 
Здравствуйте.
Столкнулся с проблемой.
Имеется: выбранная пользователем одна окружность, получаемая через doc.Selection.GetAt(0). Тип - TFlex::Model::Model2D::CircleOutline. Обычная "эскизная" окружность. На ней проставлены 2 оси, горизонтальная и вертикальная, тип TFlex::Model::Model2D::CenterAxisOutline.

Вопрос: как, имея объект CircleOutline circle = doc.Selection.GetAt(0) as CircleOutline, получить доступ к каждой из построенных на окружности осей?
Что-то в духе:
CenterAxisOutline horizontalAxis = get ??? тра ля ля
CenterAxisOutline verticalAxis = get ??? тра ля ля
Изменено: Николай - 01.04.2012 23:05:26
 
Предлагаю взять за основу такой вариант:
using System;
using System.Windows.Forms;
using TFlex.Model.Model2D;
using TFlex;
using TFlex.Drawing;
using TFlex.Model;
namespace NewMacroNamespace
{
public class NewMacroClass
{
public static void NewMacro()
{
Document doc=TFlex.Application.ActiveDocument;
CircleOutline circle = doc.Selection.GetAt(0) as CircleOutline;
Node n1=circle.CenterNode;

int count=0;
foreach (Outline cao in doc.Outlines)
{
if (cao.SubType.ToString()=="CenterAxisOutline")
{
count+=1;
Point tpStart=cao.GetPoint(0);
Point tpFinish=cao.GetPoint(1);

if (tpStart.X ==n1.AbsX)
{doc.BeginChanges("Вертикальная ось");
cao.Name="Вертикальная ось";
doc.EndChanges();}

if (tpStart.Y ==n1.AbsY)
{doc.BeginChanges("Горизонтальная ось");
cao.Name="Горизонтальная ось";
doc.EndChanges();}
doc.Selection.Select(cao);
}
}
}
}
}
 
Беда в том, что этот код посчитает горизонтальной осью все линии, координаты Y которых равны Y-координате центра окружности. Можно конечно попробовать другие более изощрённые проверки. Но неужели нет более цивилизованного способа получить элемент-потомок (ось) от элемента-предка (окружности)? Ведь сам CAD как-то связывает одно с другим!!! Попробуйте удалить окружность-родитель - сразу слетят и оси-потомки.
Я вычитал в справке по API, что есть в классе то-ли Object2D, то ли в ModelObject функция GetReference(uint id) - выдаёт ссылку на родительский объект по некоему ID. Но абсолютно нет никаких пояснений об её работе.
Господа разработчики, мало информации даёте в хелпе... Везде вопросы возникают. Люди, не владеющие телепатией, склонны читать "печатное слово". А его нет. И понеслась - форум, приват, е-мейл, аська...
 
Попытка использовать "цивилизованные методы" заканчивается руганью и сообщением о том, что "... объект типа ... не может быть приведен к типу....". Так что проверки, как мне кажется, на данном уровне владения API надежнее. Хотя есть мнение, что если вместо редактора макросов использовать VS, можно получить гораздо лучшие результаты.
А потомки должны определять предков через Parent, но он мне пока неподвластен и времени разобраться нет, хотя этот вопром мне тоже интересен. Так что если поиски решения увенчаются успехом не сочтите за труд выложить результат
 
Цитата
petrick пишет:
Попытка использовать "цивилизованные методы" заканчивается руганью и сообщением о том, что "... объект типа ... не может быть приведен к типу....".
Меня это не пугает, разберёмся при наличии документации. Пугает информационный вакуум в части подробностей об API.
Цитата
petrick пишет:
А потомки должны определять предков через Parent
- Parent что здесь означает? В TFlex API я такого не видел. Может не там ищу?
Вернусь к функции GetReference. Мне кажется это то, что мне нужно. Цитирую API:
virtual ModelObject * GetReference(int id);
Получить ссылку на родителький объект по ключу
Параметры
id Идентификатор ключа, по которому в контейнере ссылок хранится объект.
Находится в классе TFlex::Model::ModelObject.
Вопрос 1: что за "родительский объект" возвращает функция? В каком контексте это понимать?
Вопрос 2: что за "Идентификатор ключа"? Где взять? Где-то есть описание?
Вопрос 3: что за "контейнер ссылок"? Описание? Тип? Что это? Есть подозрение, что это свойство документа TFlex::Model::Document.Objects (Получение контейнера всех объектов модели, независимо от типа) но так ли это?
В общем, нужна полнота картины. Разработчики, хелп.
 
Этот код можно оформить в виде отдельной функции и передавать туда документ и идентификатор окружности


foreach(Outline LN in doc.Outlines)
{
// Ищем окружность. У вас она в селекторе возвращается.
if (LN is CircleOutline)
{
foreach(Outline LN2 in doc.Outlines)
// Просматриваем оси
{
if (LN2 is CenterAxisOutline)
{
CenterAxisOutline CAO = (CenterAxisOutline)LN2;
// Проверяем родителя у оси и сравниваем с тем, что в селекторе
if(CAO.SourceOutline.ID == LN.ID)
{
break;
}
}
}
}
}
 
Цитата
Дарья пишет:
...SourceOutline.ID
ID!
Дарья, Вам просто нет цены!

Цитата
Николай пишет:
- Parent что здесь означает? В TFlex API я такого не видел. Может не там ищу?
Извиняюсь за неточность, на самом деле свойство называется "Parents"
"__property ParentObjects* Parents;
Описание
Контейнер родительских объектов

Класс
ModelObject Класс

Ссылки
ModelObject Класс, TFlex::Model Пространство имён"
 
Дарья!!! Спасибище вам агромнныыйй ;) Дали весьма дельную подсказку! Чёрт с ним с ID!!! SourceOutline - вот он, ключик!!! Я слепой, не увидел. Перетряхнул, значит класс Outline, а CenterAxisOutline мимоходом пробежал. И самое нужное пропустил!!! Сейчас на этом принципе пересмотрел другие свои вопросы. По-моему я понял принцип нахождения связей.
Дарья. Ещё раз спасибо, вы прямо не в бровь, а в глаз.
Но всё таки интересно, что же делает функция GetReference? Про неё ведь действительно нуль на массу.
Про __property ParentObjects* Parents; в справочнике API версии 10 не нашёл информации, нашёл только в API 12й версии. Так что пока на это не буду рассчитывать, пока в конторе 10ка стоит.
Изменено: Николай - 03.04.2012 19:30:20
 
Добрый день.
У меня вопрос, похожий на тот, что задан автором этой ветки.
Задача: обычное скругление, построенное поверх окружности, касательной к двум прямым, превратить в канавку под углом 45 градусов, утопленную в деталь.
Со второй частью задачи, в которой надо строить, проблем не возникает
А вот как найти те прямые, которых касается уже существующая окружность, и выяснить четверть, в которой она расположена - не знаю.
То есть есть сама окружность Circle радиусом RR:
ConstructionOutline CircleOut = doc.Selection.GetAt(0) as ConstructionOutline;
Construction Circle = CircleOut.Construction as CircleConstruction;
Parameter RR = Circle.Param.Value;
Если бы её построили с помощью API, то это было бы
CircleConstruction Circle = new CircleConstruction(doc);
Circle.SetTangentToTwoLines(Line1,Line2,RR,variant)
но вот как узнать эти Line1, Line2, у уже существующей окружности, чтобы от них что-то построить - не понимаю(

Помогите, пожалуйста.
Изменено: Юлия П - 27.03.2015 16:06:30
 
Цитата
Юлия П написал:
но вот как узнать эти Line1, Line2, у уже существующей окружности, чтобы от них что-то построить - не понимаю(
Вы можете прикрепить файл модели?
 
Так это не модель, простой 2D чертёж. Надо скругление превратить в канавку:
рис1.JPG (9.66 КБ)
Изменено: Юлия П - 01.04.2015 09:12:26
 
Цитата
Юлия П написал:
Так это не модель, простой 2D чертёж. Надо скругление превратить в канавку:
Судя по чертежу, нужно удалить эскиз, добавить линии построения и создать новый эскиз. Не проще сделать параметрический чертеж?
Изменено: Vite - 01.04.2015 09:26:43
 
На производстве часто попадаются детали с такими канавками, на одной детали их может быть несколько. каждый раз вычерчивать её относительно долго, да ещё и делая эскизы для разных операций. вот и появилась идея ускорить процесс.
 
Цитата
Юлия П написал:
На производстве часто попадаются детали с такими канавками, на одной детали их может быть несколько. каждый раз вычерчивать её относительно долго, да ещё и делая эскизы для разных операций. вот и появилась идея ускорить процесс.

Окружности расположены по углам прямоугольника или многоугольника? Приведите несколько примеров, что бы лучше понимать задачу.
 
Вот участок шестерни, на котором три таких канавки. Задача состоит в том, чтобы сначала на этих участках строить обычные скругления, а потом поочередно их выбирая превращать в канавки:
рис2.JPG (13.52 КБ)
 
Цитата
Юлия П написал:
Вот участок шестерни, на котором три таких канавки.

Понятно, вы хотите привязаться в окружности и линиям построения. Ну хорошо, предположим вы создадите дополнительную окружность со смещением, но как вы себе представляете по новой обвести эту геометрию?
Изменено: Vite - 01.04.2015 10:49:55
 
Ну без программирования тоже можно ускорить процесс. Конечно не всё прям на автомате, но довольно таки быстро.
Ушёл остывать)
 
Цитата
Sila Musli написал:
Ну без программирования тоже можно ускорить процесс. Конечно не всё прям на автомате, но довольно таки быстро.
Ну вот Вам и решение...
 
Цитата
Vite написал:

Цитата
Юлия П написал:
Вот участок шестерни, на котором три таких канавки.
Понятно, вы хотите привязаться в окружности и линиям построения. Ну хорошо, предположим вы создадите дополнительную окружность со смещением, но как вы себе представляете по новой обвести эту геометрию?
Код
public static void Канавка()
{
Document doc=TFlex.Application.ActiveDocument;
doc.BeginChanges("");

LineConstruction Line1 = new LineConstruction(doc);
Line1.SetHorizontal(0); // - считать со скругления
LineConstruction Line2 = new LineConstruction(doc);
Line2.SetVertical(0); // - считать со скругления
LineConstruction Line3 = new LineConstruction(doc);
Line3.SetParallel(Line1,СС);
LineConstruction Line4 = new LineConstruction(doc);
Line4.SetParallel(Line2,-СС);
CircleConstruction Circle = new CircleConstruction(doc);
//1 - лев.верхн, 2 - пр.верхн, 3 - лев.нижн, 4-пр.нижн. - считать со скругления
Circle.SetTangentToTwoLines(Line3,Line4,R,Type); //R,Type - считать со скругления
LineConstruction Line5 = new LineConstruction(doc);
Line5.SetTangentToCircleOnAngle(Line1,Circle,2,25);
LineConstruction Line6 = new LineConstruction(doc);
Line6.SetTangentToCircleOnAngle(Line2,Circle,1,-25);
Node Node2 = new IntersectionNode(doc,Circle,Line5);
Node Node3 = new IntersectionNode(doc,Circle,Line6);
Node Node1 = new IntersectionNode(doc,Line1,Line5);
Node Node4 = new IntersectionNode(doc,Line2,Line6);
ConstructionOutline CO1 = new ConstructionOutline(doc,Node1,Node2,Line5);
ConstructionOutline CO2 = new ConstructionOutline(doc,Node3,Node2,Circle);
ConstructionOutline CO3 = new ConstructionOutline(doc,Node3,Node4,Line6); 
doc.EndChanges();
} 
Из всего того, что помечено признаком "Считать со скругления" мне пока удалось выудить только радиус
 
Цитата
Sila Musli написал:
Ну без программирования тоже можно ускорить процесс. Конечно не всё прям на автомате, но довольно таки быстро.
Я правильно понимаю, что добраться до родителей скругления с помощью API невозможно?
Страницы: 1 2 След.