ADN Club > Inventor API
Как наложить зависимости на блок?
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, мне как-то надо найти эти элементы среди точек и линий эскиза, чтобы наложить на них зависимости.
Навигация
Перейти к полной версии