Здравствуйте. Столкнулся с проблемой. Имеется: выбранная пользователем одна окружность, получаемая через 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 ??? тра ля ля
Предлагаю взять за основу такой вариант: 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();}
Беда в том, что этот код посчитает горизонтальной осью все линии, координаты 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; } } } } }
Дарья!!! Спасибище вам агромнныыйй Дали весьма дельную подсказку! Чёрт с ним с ID!!! SourceOutline - вот он, ключик!!! Я слепой, не увидел. Перетряхнул, значит класс Outline, а CenterAxisOutline мимоходом пробежал. И самое нужное пропустил!!! Сейчас на этом принципе пересмотрел другие свои вопросы. По-моему я понял принцип нахождения связей. Дарья. Ещё раз спасибо, вы прямо не в бровь, а в глаз. Но всё таки интересно, что же делает функция GetReference? Про неё ведь действительно нуль на массу. Про __property ParentObjects* Parents; в справочнике API версии 10 не нашёл информации, нашёл только в API 12й версии. Так что пока на это не буду рассчитывать, пока в конторе 10ка стоит.
Добрый день. У меня вопрос, похожий на тот, что задан автором этой ветки. Задача: обычное скругление, построенное поверх окружности, касательной к двум прямым, превратить в канавку под углом 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, у уже существующей окружности, чтобы от них что-то построить - не понимаю(
На производстве часто попадаются детали с такими канавками, на одной детали их может быть несколько. каждый раз вычерчивать её относительно долго, да ещё и делая эскизы для разных операций. вот и появилась идея ускорить процесс.
Юлия П написал: На производстве часто попадаются детали с такими канавками, на одной детали их может быть несколько. каждый раз вычерчивать её относительно долго, да ещё и делая эскизы для разных операций. вот и появилась идея ускорить процесс.
Окружности расположены по углам прямоугольника или многоугольника? Приведите несколько примеров, что бы лучше понимать задачу.
Вот участок шестерни, на котором три таких канавки. Задача состоит в том, чтобы сначала на этих участках строить обычные скругления, а потом поочередно их выбирая превращать в канавки:
Юлия П написал: Вот участок шестерни, на котором три таких канавки.
Понятно, вы хотите привязаться в окружности и линиям построения. Ну хорошо, предположим вы создадите дополнительную окружность со смещением, но как вы себе представляете по новой обвести эту геометрию?
Юлия П написал: Вот участок шестерни, на котором три таких канавки.
Понятно, вы хотите привязаться в окружности и линиям построения. Ну хорошо, предположим вы создадите дополнительную окружность со смещением, но как вы себе представляете по новой обвести эту геометрию?
Код
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();
}
Из всего того, что помечено признаком "Считать со скругления" мне пока удалось выудить только радиус