ADN Club > Inventor API

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

<< < (2/2)

mikazakov:
Как то так

--- Код - 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((SketchEntity)centerLine);             SketchBlockDefinition blockDef = CreateBlockDefinition(oDoc);            SketchBlock sb = sketch.SketchBlocks.AddByDefinition(blockDef, oTG.CreatePoint2d(1, 5));            oDoc.Update();             /*                и вот тут мне надо:               1. совместить точку centerLine.EndSketchPoint и точку,               которая в блоке является line1.EndSketchPoint или line3.StartSketchPoint               2. наложить горизонтальность на линию, которая в блоке является line1.                    */             SketchPoint sp1 = oCD.Sketches[1].SketchPoints[4];            SketchPoint sp2 = oCD.Sketches[1].SketchLines[1].EndSketchPoint;            oCD.Sketches[1].GeometricConstraints.AddCoincident((SketchEntity)sp1, (SketchEntity)sp2);         }
Корявая объектная модель у этих эскизных блоков, не понятно как линия экземпляр связана с её определением в блок-дефинции.


--- Цитата: R.I.Chernov от 08-07-2021, 21:17:31 --- /*
    вот тут кстати нехилая "бажина", если сделать не AddCoincident, а
    blockDef.InsertionPoint.Merge(line1.StartSketchPoint)
    то вставка в эскиз .SketchBlocks.AddByDefinition() работать не будет, а
    попытка обратиться к blockDef.IsInsertionPointVisible выбрасывает исключение;
    походу InsertionPoint повреждается каким-то образом
    */
--- Конец цитаты ---
может InsertionPoint не повреждается а при AddCoincident сливается с другой точкой и исчезает. Но это я так гипотезу выдвинул, не проверяя.

R.I.Chernov:
Спасибо, Михаил. Теоретически возможно коненчо по факту вставки блоков сразу завязываться ссылками на новые линии в PlanarSketch.SketchLines, высчитывая индексы, но при больших эскизах труд получается необоснованно огромный, проще от блоков отказаться.


--- Цитата: mikazakov от 11-07-2021, 19:25:51 ---Корявая объектная модель у этих эскизных блоков, не понятно как линия экземпляр связана с её определением в блок-дефинции.
--- Конец цитаты ---
Я вот сижу и думаю, ведь в пользовательском интерфейсе, при выборе линии блока для наложения зависимости он как-то ссылку нужную определяет? Где-то они должны по идее храниться? Или каким образом это может работать по-другому?

R.I.Chernov:

--- Цитата: R.I.Chernov от 12-07-2021, 10:59:46 ---Я вот сижу и думаю, ведь в пользовательском интерфейсе, при выборе линии блока для наложения зависимости он как-то ссылку нужную определяет? Где-то они должны по идее храниться? Или каким образом это может работать по-другому?
--- Конец цитаты ---

В общем доковырялся я до сути. ShetchBlock.GetObject(ObjectInDefinition As Object) возвращает ссылку на объект из дифинишена блока в эскизе.
Код получается такой вот:

--- Код - 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);    SketchBlock block = sketch.SketchBlocks.AddByDefinition(blockDef, oTG.CreatePoint2d(1, 5));    oDoc.Update();     /*         и вот тут мне надо:        1. совместить точку centerLine.EndSketchPoint и точку,        которая в блоке является line1.EndSketchPoint или line3.StartSketchPoint        2. наложить горизонталбность на линию, которая в блоке является line1.                 */     SketchLine line1 = (SketchLine)block.GetObject(block.Definition.SketchLines[1]);    SketchLine line3 = (SketchLine)block.GetObject(block.Definition.SketchLines[3]);    sketch.GeometricConstraints.AddHorizontal(line1);    sketch.GeometricConstraints.AddCoincident        (            (SketchEntity)centerLine.EndSketchPoint,            (SketchEntity)line3.StartSketchPoint        );}

mikazakov:

--- Цитата: R.I.Chernov от 12-07-2021, 11:43:40 ---block.GetObject
--- Конец цитаты ---
Я честно скажу даже не обратил внимание на метод с таким абстрактным названием :D

R.I.Chernov:

--- Цитата: mikazakov от 12-07-2021, 17:08:24 ---Я честно скажу даже не обратил внимание на метод с таким абстрактным названием
--- Конец цитаты ---
Понимаю: несколько раз безуспешно все прочитал, пытаясь найти логически подходящий метод или свойство, потом забил, и начал все подряд без разбора пробовать, подразумевая каждый раз, что это именно то, что мне нужно )))

Навигация

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

[*] Предыдущая страница

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