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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Пример 3D макроса, создание фигуры вращения
 
Привет Всем, кто хоть иногда пишет! :)

Дайте, pls, пример макроса результатом которого будет 3D тело вращения.
 
Я так понимаю, желающих поделиться нет?

Или, благодаря ТопСистемам, информация по АПИ стала сверхсекреной и разглашнию не подлежит.

Или ТопСистемы думают что у людей есть мегажелание расшифровывать tFlexAPI?

ps. Интересно, менеджеры ТопСистем читают эот форум? Уже 29 человек просмотрели этот топик - все же у кого-то есть интерес к программированю в TFlex.
 
Дело в том, что задача хоть и простая, но кода для этого нужно много.
Надо создать профиль на рабочей плоскости, 3D узлы, вращение - и это все программирование на C#. Будьте терпеливы, люди на форуме тоже не учат T-Flex API наизусть.

Лучше опишите свою задачу более полно. Может быть, получится вообще обойтись стандартными средствами T-FLEX без использования программирования.
 
Цитата
Osiris2000 пишет:
Дело в том, что задача хоть и простая, но кода для этого нужно много.
Я ж не против. Много-мало: лишь бы пример был.
Можно же было ТопСистемам за столько лет примеры нарисовать.
Не я же один интересуюсь. Ну я могу сам собой на форуме пообщаться. :)
Размеры так и померял. Пригодится кому-нибудь...

Цитата
Osiris2000 пишет:
Надо создать профиль на рабочей плоскости, 3D узлы, вращение - и это все программирование на C#. Будьте терпеливы, люди на форуме тоже не учат T-Flex API наизусть.

Лучше опишите свою задачу более полно. Может быть, получится вообще обойтись стандартными средствами T-FLEX без использования программирования.

Вы прекрасно описали задачу. Именно АПИ. Я стандартно могу нарисовать. Как это сделать в tFlex у ТопСистем всё описано очень хорошо и с примерами.
Но мне необходимо расчетными средствами нарисовать профиль. Это я сделал. А затем по этому профилю сделать фигуру вращения. Всё.

Был бы пример - разобрался бы.

Давайте разобьём на этапы.

Как выбрать рабочую плоскость?

Как создать 3d узел? наверное вот этот метод: CoordinateNode3D, плюс потом прописать в созданном объекте координаты.

Или вообще 3d узел создавать не надо, а рисовать 2d на рабочей плоскости?

Кто что думает - пишите. Может и пример совместно родим. ~~:-
 
Добрый день.
Тоже разбираюсь с этим вопросом.
со справки по API видно:
сама операция вращения
RotateGenerator(ProxyObject3D * object, BaseAxis * axis, Body * profile, double angle);
в нее нужно передать
1. ProxyObject3D * object - "3D объект внешнего приложения, для которого генерируется результат", этот метод вернет ProxyObject3D - тело вращения просто передаем пустой объект

ProxyObject3D po3d;
RotateGenerator rg = new RotateGenerator(po3d,"задать ось вращения","по идее эскиз",360);

осталось сделать как то эскиз и указать ось =)
 
Осталось разобраться что такое "Body * profile"

В описании "RotateGenerator Конструктор" написано что profile это Вращаемый контур. Этот контур превращается во вращение и возращается в списке резльтирующих тел или удаляется

А в описании типа Body написано что это Класс хранения геометрических тел

И как туда засунуть контур?

Да и с BaseAxis * axis тоже ничего не ясно.
 
по поводу BaseAxis * axis

Point3D p3d = new Point3D(0,0,0);
Direction bd = new Direction(0,0,10);
Axis ax = new Axis(p3d,bd);
 
кажется мы не там копаем,
вот операция вращения TFlex::Model::Model3D::Rotation
вот ее и нада ковырять.
 
Ну да, играем в угадайку.... :bal:



Свойство Описание
Angle Угол вращения
FirstAnglePoint Начальная точка вращения
FirstAxisPoint Первая точка, задающую ось вращения
GroupType Свойство GroupType, член класса Rotation.
RotationAxis Ось вращения
SecondAnglePoint Конечная точка вращения
SecondAxisPoint Вторая точка, задающая ось вращения
StartAngle Начальный угол вращения

Со свойствами Rotation понятно.

А как создается само вращение и где профиль?
 
по идее нада выбрать плоскость и на ней сделать эскиз потом этот эскиз подсунуть операции)
есть клас SketchProfile это поидее профиль эскиза.
 
Вот наковырял , но как для операции вращения выбрать ось вращения или как заштриховать не знаю
doc = TFlex.Application.NewDocument("C:\\Program Files\\T-FLEX\\T-FLEX CAD 11\\Program\\Прототипы\\3D Модель");
doc.BeginChanges("Пример использования API");

StandardWorkplane pl1 = new StandardWorkplane(doc, StandardWorkplane.StandardType.Front);

FreeNode newNode1 = new FreeNode(doc, 0, 0);
FreeNode newNode2 = new FreeNode(doc, System.Convert.ToDouble(L1.Text), 0);
ConstructionOutline newOutline1 = new ConstructionOutline(doc, newNode1, newNode2);
FreeNode newNode3 = new FreeNode(doc, System.Convert.ToDouble(L1.Text), System.Convert.ToDouble(D5.Text) - System.Convert.ToDouble(a.Text));
ConstructionOutline newOutline2 = new ConstructionOutline(doc, newNode2, newNode3);
FreeNode newNode4 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(a.Text), System.Convert.ToDouble(D5.Text));
ConstructionOutline newOutline3 = new ConstructionOutline(doc, newNode3, newNode4);
FreeNode newNode5 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L7.Text), System.Convert.ToDouble(D5.Text));
ConstructionOutline newOutline4 = new ConstructionOutline(doc, newNode4, newNode5);
FreeNode newNode6 = new FreeNode(doc, System.Convert.ToDouble(L1.Text)- System.Convert.ToDouble(a.Text), System.Convert.ToDouble(D5.Text));
ConstructionOutline newOutline5 = new ConstructionOutline(doc, newNode5, newNode6);
FreeNode newNode7 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L7.Text), System.Convert.ToDouble(D5.Text));
ConstructionOutline newOutline6 = new ConstructionOutline(doc, newNode6, newNode7);
FreeNode newNode8 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L7.Text), System.Convert.ToDouble(D4.Text));
ConstructionOutline newOutline7 = new ConstructionOutline(doc, newNode7, newNode8);
FreeNode newNode9 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L6.Text), System.Convert.ToDouble(D4.Text));
ConstructionOutline newOutline8 = new ConstructionOutline(doc, newNode8, newNode9);
FreeNode newNode10 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L6.Text), System.Convert.ToDouble(D3.Text));
ConstructionOutline newOutline9 = new ConstructionOutline(doc, newNode9, newNode10);
FreeNode newNode11 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L6.Text) - System.Convert.ToDouble(L5.Text), System.Convert.ToDouble(D3.Text));
ConstructionOutline newOutline10 = new ConstructionOutline(doc, newNode10, newNode11);
FreeNode newNode12 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L6.Text) - System.Convert.ToDouble(L5.Text), System.Convert.ToDouble(D2.Text));
ConstructionOutline newOutline11 = new ConstructionOutline(doc, newNode11, newNode12);
FreeNode newNode13 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L3.Text) , System.Convert.ToDouble(D2.Text));
ConstructionOutline newOutline12 = new ConstructionOutline(doc, newNode12, newNode13);
FreeNode newNode14 = new FreeNode(doc, System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L3.Text), System.Convert.ToDouble(D1.Text));
ConstructionOutline newOutline13 = new ConstructionOutline(doc, newNode13, newNode14);
FreeNode newNode15 = new FreeNode(doc, System.Convert.ToDouble(a.Text), System.Convert.ToDouble(D1.Text));
ConstructionOutline newOutline14 = new ConstructionOutline(doc, newNode14, newNode15);
FreeNode newNode16 = new FreeNode(doc, 0, System.Convert.ToDouble(D1.Text) - System.Convert.ToDouble(a.Text));
ConstructionOutline newOutline15 = new ConstructionOutline(doc, newNode15, newNode16);
FreeNode newNode17 = new FreeNode(doc, 0,0);
ConstructionOutline newOutline18 = new ConstructionOutline(doc, newNode16, newNode17);
//FreeNode newNode17 = new FreeNode(doc, System.Convert.ToDouble(a.Text), System.Convert.ToDouble(D1.Text));
doc.EndChanges();
doc.SaveAs("D:\\Default1.grb");
 
Пример создания тела вращения в API:


docTF.BeginChanges("Create");

FreeNode n1 = new FreeNode(docTF,(Parameter)1,(Parameter)1);
FreeNode n2 = new FreeNode(docTF,(Parameter)1,(Parameter)11);
FreeNode n3 = new FreeNode(docTF,(Parameter)7,(Parameter)6);

FreeNode ax1 = new FreeNode(docTF,(Parameter)0,(Parameter)1);
FreeNode ax2 = new FreeNode(docTF,(Parameter)0,(Parameter)15);

ConstructionOutline g1 = new ConstructionOutline (docTF, n1,n2);
ConstructionOutline g2 = new ConstructionOutline (docTF, n2,n3);
ConstructionOutline g3 = new ConstructionOutline (docTF, n3,n1);

Area ar = new Area (docTF);
Contour cn = ar.AppendContour();

ConstructionContourSegment seg1 = new ConstructionContourSegment(cn);
seg1.StartNode = n1;
seg1.EndNode = n2;
ConstructionContourSegment seg2 = new ConstructionContourSegment(cn);
seg2.StartNode = n2;
seg2.EndNode = n3;
ConstructionContourSegment seg3 = new ConstructionContourSegment(cn);
seg3.StartNode = n3;
seg3.EndNode = n1;

StandardWorkplane swp = new StandardWorkplane(docTF, StandardWorkplane.StandardType.Top);
AreaProfile pr3D =new AreaProfile(docTF);
pr3D.Area = ar;
pr3D.WorkSurface = swp;

WorkplaneNode3D ax1_3D = new WorkplaneNode3D(docTF);
ax1_3D.FirstProjection.Node = ax1;
ax1_3D.FirstProjection.WorkSurface = swp;
WorkplaneNode3D ax2_3D = new WorkplaneNode3D(docTF);
ax2_3D.FirstProjection.Node = ax2;
ax2_3D.FirstProjection.WorkSurface = swp;

Rotation RT = new Rotation(docTF);

RT.FirstAxisPoint = ax1_3D.Geometry.Point;
RT.SecondAxisPoint = ax2_3D.Geometry.Point;
RT.Profile.Add(pr3D.Geometry.SheetContour);

docTF.EndChanges();
Изменено: helper - 14.12.2010 14:55:50
 
Огромное спасибо!

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

Построил 3Д узел

CoordinateNode3D N3 = new CoordinateNode3D(doc);
N3.X = -(System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L3.Text) + System.Convert.ToDouble(L2.Text));
N3.Y = System.Convert.ToDouble(D2.Text) / 2;
N3.Z = 0;

Создал отверстие и указал какое
Hole Hole1 = new Hole("Oblong hole for fasteners.GRB", doc);
Есть метод Hole1.AddHole(тип ModelFace, 3Д узел)
Где брать эту грань (ModelFace), в каде понятно , мышью выделил и поставил, а как указать какую именно грань на теле вращения через апи ?
 
Не знаю правильно ли добрася до грани , но выдает ошибку :"Ошибка регенерации отверстия"

Rotation rotation1 = new Rotation(doc);
rotation1.Angle = 360;
rotation1.Profile.Add(Pr1.Geometry.SheetContour);
rotation1.FirstAxisPoint = N1.Geometry.Point;
rotation1.SecondAxisPoint = N2.Geometry.Point;


ModelFace Gran = null;
System.Collections.IEnumerator B = rotation1.Profile.GetEnumerator();
while (B.MoveNext())
{
System.Collections.IEnumerator C = ((ModelContour)B.Current).GetEnumerator();
while (C.MoveNext())
{
System.Collections.IEnumerator F = ((ModelBody)C.Current).Faces.GetEnumerator();
while (F.MoveNext())
{
Gran = ((ModelFace)F.Current).Body.Faces[0].Surface;

}
}

}




CoordinateNode3D N3 = new CoordinateNode3D(doc);
N3.X = -(System.Convert.ToDouble(L1.Text) - System.Convert.ToDouble(L3.Text) + System.Convert.ToDouble(L2.Text));
N3.Y = System.Convert.ToDouble(D2.Text) / 2;
N3.Z = 0;



Hole Hole1 = new Hole("Oblong hole for fasteners.GRB", doc);
Hole1.AddHole(Gran, N1);
 
Немного не так , вот последнее , но все равно не работает
ModelFace Gran = null;
System.Collections.IEnumerator B = rotation1.Profile.GetEnumerator();
while (B.MoveNext())
{
System.Collections.IEnumerator C = ((ModelContour)B.Current).GetEnumerator();
while (C.MoveNext())
{
System.Collections.IEnumerator F = ((ModelBody)C.Current).Faces.GetEnumerator();
while (F.MoveNext())
{
Gran = (ModelFace)F.Current;
// break;
}
}
Страницы: 1