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

Автор Тема: Как наложить зависимости на блок?  (Прочитано 3704 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 18
Доброго времени суток, уважаемые форумчане. Помогите пожалуйста решить задачу. У меня есть блок в эскизе. Ну то есть условно создаю эскиз, создаю в нем прямоугольник, запихиваю его в блок. Не могу понять, каким образом этот блок привязать в эскизе. Ну то есть, чтобы он не имел степеней свободы, я должен наложить зависимость совмещения на одну из вершин прямоугольника, и, например, сделать одну из его сторон вертикальной. Может конечно я туплю дико, но не могу понять, как вобще получить доступ к точкам и линиям эскизного блока? Буду рад любой подсказке!
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 658
  • Карма: 169
  • Skype: mikazakov@mail.ru
Re: Как наложить зависимости на блок?
« Ответ #1 : 02-07-2021, 21:41:13 »
Я вижу что линии экземпляра блока появляются в коллекции линий типа PlanarSketch.SketchLines
Видимо к ним и привязываться надо
Каждая линия в эскизном блоке имеет свойство SketchLine.ContainingSketchBlock , чтобы посмотреть к какому блоку она принадлежит.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 18
Re: Как наложить зависимости на блок?
« Ответ #2 : 08-07-2021, 12:02:03 »
Спасибо, Михаил. Но пока не помогло (( Стока времени угрохал, а разобраться не вышло.  Не пойму, как мне из блока вставленного в эскиз выдернуть конкретную нужную точку. Ну то есть у меня было построение блока в нужной мне последовательности. Я знаю,что например у третьей линии блока стартовую точку я хочу совместить с чем-то в эскизе. Линии блока хранятся в SketchBlockDefinition.SketchLines, но SketchBlockDefinition это же абстрактная конструкция, которая определяет геометрию всех блоков в детали. Мне же надо взять в детали какой-то эскиз, найти в нем один из вставленных одинаковых блоков, обратиться к линии, которая в дефинишене этого блока имеет какой-то нужный мне порядковый номер. Всю голову сломал. Есть какие-то идеи?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 658
  • Карма: 169
  • Skype: mikazakov@mail.ru
Re: Как наложить зависимости на блок?
« Ответ #3 : 08-07-2021, 16:47:29 »
ну давайте причесанный пример с инструкциями что нужно сделать

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 18
Re: Как наложить зависимости на блок?
« Ответ #4 : 08-07-2021, 21:17:31 »
ну давайте причесанный пример с инструкциями что нужно сделать

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

Код - C# [Выбрать]
  1. public static void CreateBlock()
  2. {
  3.     PartDocument oDoc = (PartDocument)oApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject);
  4.     PartComponentDefinition oCD = oDoc.ComponentDefinition;
  5.     PlanarSketch sketch = oCD.Sketches.Add(oCD.WorkPlanes[3]);
  6.     TransientGeometry oTG = oApp.TransientGeometry;
  7.  
  8.     SketchPoint startPoint = (SketchPoint)sketch.AddByProjectingEntity(oCD.WorkPoints[1]);
  9.     SketchLine centerLine = sketch.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(0, 0), oTG.CreatePoint2d(0, 5));
  10.     centerLine.StartSketchPoint.Merge(startPoint);
  11.     sketch.GeometricConstraints.AddVertical(centerLine);
  12.  
  13.     SketchBlockDefinition blockDef = CreateBlockDefinition(oDoc);
  14.     sketch.SketchBlocks.AddByDefinition(blockDef, oTG.CreatePoint2d(1, 5));
  15.     oDoc.Update();
  16.  
  17.     /*
  18.         и вот тут мне надо:
  19.         1. совместить точку centerLine.EndSketchPoint и точку,
  20.         которая в блоке является line1.EndSketchPoint или line3.StartSketchPoint
  21.         2. наложить горизонтальность на линию, которая в блоке является line1.            
  22.  
  23.     */
  24. }
  25.  
  26. public static SketchBlockDefinition CreateBlockDefinition(PartDocument oDoc)
  27. {
  28.     PartComponentDefinition oCD = oDoc.ComponentDefinition;
  29.     SketchBlockDefinition blockDef = oCD.SketchBlockDefinitions.Add("MyBlock");
  30.     Inventor.Application oApp = (Inventor.Application)oCD.Application;
  31.     TransientGeometry oTG = oApp.TransientGeometry;
  32.  
  33.     var startPoint = blockDef.InsertionPoint.Geometry;
  34.  
  35.     int length = 1;
  36.     var line1 = blockDef.SketchLines.AddByTwoPoints(startPoint, oTG.CreatePoint2d(startPoint.X + length, startPoint.Y));
  37.     var line2 = blockDef.SketchLines.AddByTwoPoints(startPoint, oTG.CreatePoint2d(startPoint.X, startPoint.Y + length));
  38.     var line3 = blockDef.SketchLines.AddByTwoPoints(line1.EndSketchPoint, line2.EndSketchPoint);
  39.  
  40.     blockDef.GeometricConstraints.AddGround((SketchEntity)blockDef.InsertionPoint);
  41.     blockDef.GeometricConstraints.AddCoincident((SketchEntity)line1.StartSketchPoint, (SketchEntity)blockDef.InsertionPoint);
  42.     blockDef.IsInsertionPointVisible = true;
  43.     /*
  44.     вот тут кстати нехилая "бажина", если сделать не AddCoincident, а
  45.     blockDef.InsertionPoint.Merge(line1.StartSketchPoint)
  46.     то вставка в эскиз .SketchBlocks.AddByDefinition() работать не будет, а
  47.     попытка обратиться к blockDef.IsInsertionPointVisible выбрасывает исключение;
  48.     походу InsertionPoint повреждается каким-то образом
  49.     */
  50.  
  51.  
  52.     line1.StartSketchPoint.Merge(line2.StartSketchPoint);
  53.     blockDef.GeometricConstraints.AddHorizontal(line1);
  54.     blockDef.GeometricConstraints.AddVertical(line2);
  55.  
  56.  
  57.     double offset = 0.5;
  58.     blockDef.DimensionConstraints.AddTwoPointDistance
  59.         (
  60.             line1.StartSketchPoint,
  61.             line1.EndSketchPoint,
  62.             DimensionOrientationEnum.kAlignedDim,
  63.             oTG.CreatePoint2d(line1.Geometry.MidPoint.X, line1.Geometry.MidPoint.Y - offset)
  64.         );
  65.  
  66.     blockDef.DimensionConstraints.AddTwoPointDistance
  67.         (
  68.             line2.StartSketchPoint,
  69.             line2.EndSketchPoint,
  70.             DimensionOrientationEnum.kAlignedDim,
  71.             oTG.CreatePoint2d(line2.Geometry.MidPoint.X - offset, line2.Geometry.MidPoint.Y)
  72.         );
  73.  
  74.     return blockDef;
  75. }

Постарался максимально упростить пример, чтобы просто передать идею. Суть задачи в целом такова, что у меня есть ссылка на линию или точку внутри SketchBlockDefinition, мне как-то надо найти эти элементы среди точек и линий эскиза, чтобы наложить на них зависимости.
« Последнее редактирование: 08-07-2021, 22:24:23 от R.I.Chernov »
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 658
  • Карма: 169
  • Skype: mikazakov@mail.ru
Re: Как наложить зависимости на блок?
« Ответ #5 : 11-07-2021, 19:25:51 »
Как то так
Код - C# [Выбрать]
  1.        public static void CreateBlock()
  2.         {
  3.             PartDocument oDoc = (PartDocument)oApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject);
  4.             PartComponentDefinition oCD = oDoc.ComponentDefinition;
  5.             PlanarSketch sketch = oCD.Sketches.Add(oCD.WorkPlanes[3]);
  6.             TransientGeometry oTG = oApp.TransientGeometry;
  7.  
  8.             SketchPoint startPoint = (SketchPoint)sketch.AddByProjectingEntity(oCD.WorkPoints[1]);
  9.             SketchLine centerLine = sketch.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(0, 0), oTG.CreatePoint2d(0, 5));
  10.             centerLine.StartSketchPoint.Merge(startPoint);
  11.             sketch.GeometricConstraints.AddVertical((SketchEntity)centerLine);
  12.  
  13.             SketchBlockDefinition blockDef = CreateBlockDefinition(oDoc);
  14.             SketchBlock sb = sketch.SketchBlocks.AddByDefinition(blockDef, oTG.CreatePoint2d(1, 5));
  15.             oDoc.Update();
  16.  
  17.             /*
  18.                и вот тут мне надо:
  19.                1. совместить точку centerLine.EndSketchPoint и точку,
  20.                которая в блоке является line1.EndSketchPoint или line3.StartSketchPoint
  21.                2. наложить горизонтальность на линию, которая в блоке является line1.        
  22.             */
  23.  
  24.             SketchPoint sp1 = oCD.Sketches[1].SketchPoints[4];
  25.             SketchPoint sp2 = oCD.Sketches[1].SketchLines[1].EndSketchPoint;
  26.             oCD.Sketches[1].GeometricConstraints.AddCoincident((SketchEntity)sp1, (SketchEntity)sp2);
  27.  
  28.         }

Корявая объектная модель у этих эскизных блоков, не понятно как линия экземпляр связана с её определением в блок-дефинции.

/*
    вот тут кстати нехилая "бажина", если сделать не AddCoincident, а
    blockDef.InsertionPoint.Merge(line1.StartSketchPoint)
    то вставка в эскиз .SketchBlocks.AddByDefinition() работать не будет, а
    попытка обратиться к blockDef.IsInsertionPointVisible выбрасывает исключение;
    походу InsertionPoint повреждается каким-то образом
    */
может InsertionPoint не повреждается а при AddCoincident сливается с другой точкой и исчезает. Но это я так гипотезу выдвинул, не проверяя.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 18
Re: Как наложить зависимости на блок?
« Ответ #6 : 12-07-2021, 10:59:46 »
Спасибо, Михаил. Теоретически возможно коненчо по факту вставки блоков сразу завязываться ссылками на новые линии в PlanarSketch.SketchLines, высчитывая индексы, но при больших эскизах труд получается необоснованно огромный, проще от блоков отказаться.

Корявая объектная модель у этих эскизных блоков, не понятно как линия экземпляр связана с её определением в блок-дефинции.
Я вот сижу и думаю, ведь в пользовательском интерфейсе, при выборе линии блока для наложения зависимости он как-то ссылку нужную определяет? Где-то они должны по идее храниться? Или каким образом это может работать по-другому?
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 12-07-2021, 11:43:53

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 18
Re: Как наложить зависимости на блок?
« Ответ #7 : 12-07-2021, 11:43:40 »
Я вот сижу и думаю, ведь в пользовательском интерфейсе, при выборе линии блока для наложения зависимости он как-то ссылку нужную определяет? Где-то они должны по идее храниться? Или каким образом это может работать по-другому?

В общем доковырялся я до сути. ShetchBlock.GetObject(ObjectInDefinition As Object) возвращает ссылку на объект из дифинишена блока в эскизе.
Код получается такой вот:
Код - C# [Выбрать]
  1. public static void CreateBlock()
  2. {
  3.     PartDocument oDoc = (PartDocument)oApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject);
  4.     PartComponentDefinition oCD = oDoc.ComponentDefinition;
  5.     PlanarSketch sketch = oCD.Sketches.Add(oCD.WorkPlanes[3]);
  6.     TransientGeometry oTG = oApp.TransientGeometry;
  7.  
  8.     SketchPoint startPoint = (SketchPoint)sketch.AddByProjectingEntity(oCD.WorkPoints[1]);
  9.     SketchLine centerLine = sketch.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(0, 0), oTG.CreatePoint2d(0, 5));
  10.     centerLine.StartSketchPoint.Merge(startPoint);
  11.     sketch.GeometricConstraints.AddVertical(centerLine);
  12.  
  13.     SketchBlockDefinition blockDef = CreateBlockDefinition(oDoc);
  14.     SketchBlock block = sketch.SketchBlocks.AddByDefinition(blockDef, oTG.CreatePoint2d(1, 5));
  15.     oDoc.Update();
  16.  
  17.     /*
  18.         и вот тут мне надо:
  19.         1. совместить точку centerLine.EndSketchPoint и точку,
  20.         которая в блоке является line1.EndSketchPoint или line3.StartSketchPoint
  21.         2. наложить горизонталбность на линию, которая в блоке является line1.            
  22.  
  23.     */
  24.  
  25.     SketchLine line1 = (SketchLine)block.GetObject(block.Definition.SketchLines[1]);
  26.     SketchLine line3 = (SketchLine)block.GetObject(block.Definition.SketchLines[3]);
  27.     sketch.GeometricConstraints.AddHorizontal(line1);
  28.     sketch.GeometricConstraints.AddCoincident
  29.         (
  30.             (SketchEntity)centerLine.EndSketchPoint,
  31.             (SketchEntity)line3.StartSketchPoint
  32.         );
  33. }

В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 658
  • Карма: 169
  • Skype: mikazakov@mail.ru
Re: Как наложить зависимости на блок?
« Ответ #8 : 12-07-2021, 17:08:24 »
block.GetObject
Я честно скажу даже не обратил внимание на метод с таким абстрактным названием :D

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 18
Re: Как наложить зависимости на блок?
« Ответ #9 : 12-07-2021, 17:36:42 »
Я честно скажу даже не обратил внимание на метод с таким абстрактным названием
Понимаю: несколько раз безуспешно все прочитал, пытаясь найти логически подходящий метод или свойство, потом забил, и начал все подряд без разбора пробовать, подразумевая каждый раз, что это именно то, что мне нужно )))
В программировании я новичок...но ненадолго! ;)