ADN Club > Inventor API

Как наложить зависимости на блок?

(1/2) > >>

R.I.Chernov:
Доброго времени суток, уважаемые форумчане. Помогите пожалуйста решить задачу. У меня есть блок в эскизе. Ну то есть условно создаю эскиз, создаю в нем прямоугольник, запихиваю его в блок. Не могу понять, каким образом этот блок привязать в эскизе. Ну то есть, чтобы он не имел степеней свободы, я должен наложить зависимость совмещения на одну из вершин прямоугольника, и, например, сделать одну из его сторон вертикальной. Может конечно я туплю дико, но не могу понять, как вобще получить доступ к точкам и линиям эскизного блока? Буду рад любой подсказке!

mikazakov:
Я вижу что линии экземпляра блока появляются в коллекции линий типа PlanarSketch.SketchLines
Видимо к ним и привязываться надо
Каждая линия в эскизном блоке имеет свойство SketchLine.ContainingSketchBlock , чтобы посмотреть к какому блоку она принадлежит.

R.I.Chernov:
Спасибо, Михаил. Но пока не помогло (( Стока времени угрохал, а разобраться не вышло.  Не пойму, как мне из блока вставленного в эскиз выдернуть конкретную нужную точку. Ну то есть у меня было построение блока в нужной мне последовательности. Я знаю,что например у третьей линии блока стартовую точку я хочу совместить с чем-то в эскизе. Линии блока хранятся в SketchBlockDefinition.SketchLines, но SketchBlockDefinition это же абстрактная конструкция, которая определяет геометрию всех блоков в детали. Мне же надо взять в детали какой-то эскиз, найти в нем один из вставленных одинаковых блоков, обратиться к линии, которая в дефинишене этого блока имеет какой-то нужный мне порядковый номер. Всю голову сломал. Есть какие-то идеи?

mikazakov:
ну давайте причесанный пример с инструкциями что нужно сделать

R.I.Chernov:

--- Цитата: mikazakov от 08-07-2021, 16:47:29 ---ну давайте причесанный пример с инструкциями что нужно сделать
--- Конец цитаты ---

Ок, вот что-то наподобие такого:


--- Код - C# [Выбрать] ---public static void CreateBlock(){    PartDocument oDoc = (PartDocument)oApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject);    PartComponentDefinition oCD = oDoc.ComponentDefinition;    PlanarSketch sketch = oCD.Sketches.Add(oCD.WorkPlanes[3]);    TransientGeometry oTG = oApp.TransientGeometry;     SketchPoint startPoint = (SketchPoint)sketch.AddByProjectingEntity(oCD.WorkPoints[1]);    SketchLine centerLine = sketch.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(0, 0), oTG.CreatePoint2d(0, 5));    centerLine.StartSketchPoint.Merge(startPoint);    sketch.GeometricConstraints.AddVertical(centerLine);     SketchBlockDefinition blockDef = CreateBlockDefinition(oDoc);    sketch.SketchBlocks.AddByDefinition(blockDef, oTG.CreatePoint2d(1, 5));    oDoc.Update();     /*         и вот тут мне надо:        1. совместить точку centerLine.EndSketchPoint и точку,        которая в блоке является line1.EndSketchPoint или line3.StartSketchPoint        2. наложить горизонтальность на линию, которая в блоке является line1.                 */} public static SketchBlockDefinition CreateBlockDefinition(PartDocument oDoc){    PartComponentDefinition oCD = oDoc.ComponentDefinition;    SketchBlockDefinition blockDef = oCD.SketchBlockDefinitions.Add("MyBlock");    Inventor.Application oApp = (Inventor.Application)oCD.Application;    TransientGeometry oTG = oApp.TransientGeometry;     var startPoint = blockDef.InsertionPoint.Geometry;     int length = 1;    var line1 = blockDef.SketchLines.AddByTwoPoints(startPoint, oTG.CreatePoint2d(startPoint.X + length, startPoint.Y));    var line2 = blockDef.SketchLines.AddByTwoPoints(startPoint, oTG.CreatePoint2d(startPoint.X, startPoint.Y + length));    var line3 = blockDef.SketchLines.AddByTwoPoints(line1.EndSketchPoint, line2.EndSketchPoint);     blockDef.GeometricConstraints.AddGround((SketchEntity)blockDef.InsertionPoint);    blockDef.GeometricConstraints.AddCoincident((SketchEntity)line1.StartSketchPoint, (SketchEntity)blockDef.InsertionPoint);    blockDef.IsInsertionPointVisible = true;    /*    вот тут кстати нехилая "бажина", если сделать не AddCoincident, а    blockDef.InsertionPoint.Merge(line1.StartSketchPoint)    то вставка в эскиз .SketchBlocks.AddByDefinition() работать не будет, а    попытка обратиться к blockDef.IsInsertionPointVisible выбрасывает исключение;    походу InsertionPoint повреждается каким-то образом    */      line1.StartSketchPoint.Merge(line2.StartSketchPoint);    blockDef.GeometricConstraints.AddHorizontal(line1);    blockDef.GeometricConstraints.AddVertical(line2);      double offset = 0.5;    blockDef.DimensionConstraints.AddTwoPointDistance        (            line1.StartSketchPoint,            line1.EndSketchPoint,            DimensionOrientationEnum.kAlignedDim,            oTG.CreatePoint2d(line1.Geometry.MidPoint.X, line1.Geometry.MidPoint.Y - offset)        );     blockDef.DimensionConstraints.AddTwoPointDistance        (            line2.StartSketchPoint,            line2.EndSketchPoint,            DimensionOrientationEnum.kAlignedDim,            oTG.CreatePoint2d(line2.Geometry.MidPoint.X - offset, line2.Geometry.MidPoint.Y)        );     return blockDef;}
Постарался максимально упростить пример, чтобы просто передать идею. Суть задачи в целом такова, что у меня есть ссылка на линию или точку внутри SketchBlockDefinition, мне как-то надо найти эти элементы среди точек и линий эскиза, чтобы наложить на них зависимости.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии