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