Создание кругового массива с помощью API Inventor

Автор Тема: Создание кругового массива с помощью API Inventor  (Прочитано 10267 раз)

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

Оффлайн ЕленаАвтор темы

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Здравствуйте. Я новичок в программировании для Inventor. Подскажите пожалуйста, как создать круговой массив элементов (отверстия под крепления) на 2d чертеже. Если возможно, с примером на VB.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Елена, я вижу вы новичок не только в программировании, но и в моделировании. Отверстия под крепления, по определенным причинам, гораздо лучше создавать на уровне модели, чем в эскизе. Через часик на перерыве я взгляну что может АПИ

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
как создать круговой массив элементов (отверстия под крепления) на 2d чертеже
В общем ответ: что бы оно было именно в виде массива на чертеже - никак. Удалить можно.
В модели это сделать можно, если интересно то потом можно поговорить на эту тему

Оффлайн ЕленаАвтор темы

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
как создать круговой массив элементов (отверстия под крепления) на 2d чертеже
В общем ответ: что бы оно было именно в виде массива на чертеже - никак. Удалить можно.
В модели это сделать можно, если интересно то потом можно поговорить на эту тему
Спасибо за ответ. В моделировании я полнейший чайник. Если на чертеже сделать нельзя, значит из чертежа нужно создать 3d модель (я делаю это выдавливанием) и потом делать отверстия на ней? Подскажите пожалуйста, как же это сделать?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Подскажите пожалуйста, как же это сделать?
Любопытно: цель создавать программно деталь?
Я деталь при атачил как нужно массив отверстий. Для 2016-ой версии

Оффлайн ЕленаАвтор темы

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Подскажите пожалуйста, как же это сделать?
Любопытно: цель создавать программно деталь?
Я деталь при атачил как нужно массив отверстий. Для 2016-ой версии
Да, цель - создать деталь программно. Начальство очень хочет, не могу отказать (: Пишу на vb.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Елена,
Начальство очень хочет, не могу отказать
Это ж что у вас за кантора раз такие эксперименты ставят?
Начальство видимо не все понимает в плане Инвентора.
Проще сделать какой нибудь iPart и опубликовать его в контент центр.
Я сделал тестовый проект на VB, и деталь для теста.
Деталь в инвенторе откроешь, код запустишь, результат получишь.
Начальству привет, пусть подумают сначала хорошо на уровне пользователя инвентор освоить а уж потом если что то не хватает, тогда в программирование залазить.
На самом деле такие вещи при моделировании через API требуют интарактивности, а это не просто 100 строк кода.

Оффлайн ЕленаАвтор темы

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Елена,
Начальство очень хочет, не могу отказать
Это ж что у вас за кантора раз такие эксперименты ставят?
Начальство видимо не все понимает в плане Инвентора.
Проще сделать какой нибудь iPart и опубликовать его в контент центр.
Я сделал тестовый проект на VB, и деталь для теста.
Деталь в инвенторе откроешь, код запустишь, результат получишь.
Начальству привет, пусть подумают сначала хорошо на уровне пользователя инвентор освоить а уж потом если что то не хватает, тогда в программирование залазить.
На самом деле такие вещи при моделировании через API требуют интарактивности, а это не просто 100 строк кода.
Большое спасибо. (: На счет 100 строк кода - это я уже поняла, мне инвентор быстрее освоить будет, чем описать программно сложные детали (а они сложные), но куда деваться.

Оффлайн vahrusha

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Здравствуйте! Подскажите, пожалуйста, в чем ошибка при создании кругового массива.

Код - vb.net [Выбрать]
  1. Sub CircularPatternFeatures ()
  2.  
  3.         Dim iApp As Inventor.Application
  4.         iApp = Marshal.GetActiveObject("Inventor.Application")
  5.  
  6.         Dim oPart As PartDocument
  7.         oPart = iApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject, iApp.FileManager.GetTemplateFile(DocumentTypeEnum.kPartDocumentObject))
  8.  
  9.         Dim oCompDef As PartComponentDefinition
  10.         oCompDef = oPart.ComponentDefinition
  11.  
  12.         With oPart.UnitsOfMeasure
  13.             .LengthUnits = UnitsTypeEnum.kMillimeterLengthUnits
  14.             .MassUnits = UnitsTypeEnum.kKilogramMassUnits
  15.             .AngleUnits = UnitsTypeEnum.kGradAngleUnits
  16.             .TimeUnits = UnitsTypeEnum.kSecondTimeUnits
  17.         End With
  18.  
  19.         Dim oSketch As PlanarSketch
  20.         oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
  21.  
  22.         Dim oTransGeom As TransientGeometry
  23.         oTransGeom = iApp.TransientGeometry
  24.  
  25.         Dim oSkPoint As SketchPoint
  26.         oSkPoint = oSketch.AddByProjectingEntity(oCompDef.WorkPoints(1))
  27.         Dim oSkLine1, oSkLine2 As SketchLine
  28.         oSkLine1 = oSketch.AddByProjectingEntity(oCompDef.WorkAxes.Item(1))
  29.         oSkLine1.Construction = False
  30.         oSkLine2 = oSketch.AddByProjectingEntity(oCompDef.WorkAxes.Item(2))
  31.         oSkLine2.Centerline = True
  32.         Dim oCoord1, oCoord0 As Point2d
  33.  
  34.         oCoord0 = oTransGeom.CreatePoint2d(0, 0)
  35.  
  36.         Dim oPoint0 As SketchPoint
  37.         oPoint0 = oSketch.SketchPoints.Add(oCoord0, True)
  38.  
  39.         oCoord1 = oTransGeom.CreatePoint2d(0, 0)
  40.         Dim oCoord2 As Point2d
  41.         oCoord2 = oTransGeom.CreatePoint2d(120, 0)
  42.         Dim oLines(0 To 3) As SketchLine
  43.         oLines(0) = oSketch.SketchLines.AddByTwoPoints(oPoint0, oCoord2)
  44.         Call oSketch.DimensionConstraints.AddTwoPointDistance(oLines(0).StartSketchPoint, oLines(0).EndSketchPoint, DimensionOrientationEnum.kAlignedDim, oCoord2, False)
  45.         oCoord1 = oTransGeom.CreatePoint2d(120, 20)
  46.         oLines(1) = oSketch.SketchLines.AddByTwoPoints(oLines(0).EndSketchPoint, oCoord1)
  47.         Call oSketch.DimensionConstraints.AddTwoPointDistance(oLines(1).StartSketchPoint, oLines(1).EndSketchPoint, DimensionOrientationEnum.kAlignedDim, oCoord1, False)
  48.         oCoord1 = oTransGeom.CreatePoint2d(70, 20)
  49.         oCoord2 = oTransGeom.CreatePoint2d(70, 70)
  50.         Dim oArc As SketchArc
  51.         oArc = oSketch.SketchArcs.AddByCenterStartEndPoint(oCoord1, oLines(1).EndSketchPoint, oCoord2)
  52.         Call oSketch.DimensionConstraints.AddRadius(oArc, oCoord1, False)
  53.  
  54.         oCoord1 = oTransGeom.CreatePoint2d(0, 70)
  55.  
  56.         oLines(2) = oSketch.SketchLines.AddByTwoPoints(oArc.EndSketchPoint, oCoord1)
  57.         oLines(3) = oSketch.SketchLines.AddByTwoPoints(oLines(0).StartSketchPoint, oLines(2).EndSketchPoint)
  58.  
  59.         Dim oPoint As SketchPoint
  60.         oPoint = oSketch.SketchPoints.Add(oCoord1, False)
  61.         Call oPoint.MoveTo(oTransGeom.CreatePoint2d(1, 71))
  62.  
  63.         Call oSketch.DimensionConstraints.AddTwoPointDistance(oLines(2).StartSketchPoint, oLines(2).EndSketchPoint, DimensionOrientationEnum.kAlignedDim, oCoord1, False)
  64.  
  65.         Call oSketch.GeometricConstraints.AddHorizontal(oLines(0))
  66.         Call oSketch.GeometricConstraints.AddPerpendicular(oLines(0), oLines(1))
  67.         Call oSketch.GeometricConstraints.AddTangent(oLines(1), oArc)
  68.         Call oSketch.GeometricConstraints.AddTangent(oLines(2), oArc)
  69.         Call oSketch.GeometricConstraints.AddParallel(oLines(0), oLines(2))
  70.         Call oSketch.GeometricConstraints.AddParallel(oLines(0), oSkLine1)
  71.  
  72.         Call oPoint0.MoveTo(oTransGeom.CreatePoint2d(1, 1))
  73.  
  74.         Dim oTextCoord As Point2d
  75.         oTextCoord = oTransGeom.CreatePoint2d(2, 2)
  76.         Call oSketch.DimensionConstraints.AddOffset(oSkLine2, oLines(0).StartSketchPoint, oTextCoord, True, False)
  77.         oSketch.DimensionConstraints.Item(oSketch.DimensionConstraints.Count).Parameter.Value = 35
  78.         Call oSketch.DimensionConstraints.AddOffset(oSkLine1, oLines(0).StartSketchPoint, oTextCoord, False, False)
  79.         oSketch.DimensionConstraints.Item(oSketch.DimensionConstraints.Count).Parameter.Value = 35
  80.  
  81.         Dim oPr As Profile
  82.         oPr = oSketch.Profiles.AddForSolid
  83.  
  84.         Dim oRevFeature, oRevFeature1 As RevolveFeature
  85.         oRevFeature = oCompDef.Features.RevolveFeatures.AddFull(oPr, oSkLine2, PartFeatureOperationEnum.kJoinOperation)
  86.         oRevFeature1 = oCompDef.Features.RevolveFeatures.AddByAngle(oPr, oSkLine2, 20.ToString, PartFeatureExtentDirectionEnum.kSymmetricExtentDirection, PartFeatureOperationEnum.kCutOperation)
  87.  
  88.         Dim oObCol As ObjectCollection
  89.         oObCol = iApp.TransientObjects.CreateObjectCollection
  90.         Call oObCol.Add(oRevFeature1)
  91.  
  92.         Call oCompDef.Features.CircularPatternFeatures.Add(oObCol, oCompDef.WorkAxes.Item(2), False, 3, 30, True) '- массив вокруг оси Y
  93.         '(Ошибка: System.Runtime.InteropServices.COMException :  "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))")
  94.  
  95.         oSketch.Visible = False
  96.  
  97. End Sub

Заранее огромное спасибо!
« Последнее редактирование: 16-05-2022, 21:11:49 от vahrusha »

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
В среду только дома буду, тогда и посмотрю.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Здравствуйте! Подскажите, пожалуйста, в чем ошибка при создании кругового массива.

Доброго времени суток. Сложно судить, вы скрыли от нас геометрию эскиза. Возможно физически невозможно сделать поворот массива вокруг оси Y.

Хотя больше похоже, что у вас просто нет тела к 34  строке, вы пробовали ее закомментировать, и выполнить без нее, код работает? В 28 строке (простите если путаю),  20.ToString - это угол. Почти уверен, что он должен быть в радианах. Вот и посудите, что останется, если из 6.28 вычесть 20 радиан )) В 34 строке соответственно тоже надо исправить угол на радианы.

Ниже пример построения массива попроще, без вращения.

Код - C# [Выбрать]
  1. public void CircularPatternCreation()
  2. {
  3.     // App - ссылка на приложение инвентора с созданной пустой деталью
  4.     TransientGeometry oTG = App.TransientGeometry;
  5.     TransientObjects oTO = App.TransientObjects;
  6.     PartDocument doc = (PartDocument)App.ActiveDocument;
  7.     PartComponentDefinition oCD = doc.ComponentDefinition;
  8.  
  9.     // создаем в детали тело с отверстием
  10.     ExtrudeFeature hole = CreateBodyWithHole(oCD, oTG);
  11.  
  12.     CircularPatternFeatures features = oCD.Features.CircularPatternFeatures;
  13.     ObjectCollection objects = oTO.CreateObjectCollection();
  14.     objects.Add(hole);
  15.  
  16.     CircularPatternFeatureDefinition circularDefinition
  17.         = features.CreateDefinition(objects, oCD.WorkAxes[3], true, 2, Math.PI / 2);
  18.     oCD.Features.CircularPatternFeatures.AddByDefinition(circularDefinition);
  19. }
  20.  
  21. private ExtrudeFeature CreateBodyWithHole(PartComponentDefinition cd, TransientGeometry tg)
  22. {
  23.     PlanarSketch sketch = cd.Sketches.Add(cd.WorkPlanes[3]);
  24.     PlanarSketch sketch2 = cd.Sketches.Add(cd.WorkPlanes[3]);
  25.  
  26.     sketch.SketchLines.AddAsTwoPointRectangle(tg.CreatePoint2d(10, 10), tg.CreatePoint2d(-10, -10));
  27.     Profile profile = sketch.Profiles.AddForSolid();
  28.  
  29.     ExtrudeFeatures features = cd.Features.ExtrudeFeatures;
  30.  
  31.     ExtrudeDefinition extrudeDefinition
  32.         = features.CreateExtrudeDefinition(profile, PartFeatureOperationEnum.kJoinOperation);
  33.     extrudeDefinition.SetDistanceExtent(2, PartFeatureExtentDirectionEnum.kSymmetricExtentDirection);
  34.  
  35.     cd.Features.ExtrudeFeatures.Add(extrudeDefinition);
  36.  
  37.     sketch2.SketchCircles.AddByCenterRadius(tg.CreatePoint2d(5, 0), 1.5);
  38.     Profile profile2 = sketch2.Profiles.AddForSolid();
  39.  
  40.  
  41.     ExtrudeDefinition extrudeDefinition2
  42.         = features.CreateExtrudeDefinition(profile2, PartFeatureOperationEnum.kCutOperation);
  43.     extrudeDefinition2.SetThroughAllExtent(PartFeatureExtentDirectionEnum.kSymmetricExtentDirection);
  44.  
  45.     return cd.Features.ExtrudeFeatures.Add(extrudeDefinition2);
  46. }
В программировании я новичок...но ненадолго! ;)

Оффлайн vahrusha

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
R.I.Chernov, спасибо за ответ! Отредактировал предыдущее сообщение (привел полностью код). Строится все в градусах и мм. CircularPatternFeatureDefinition - такого объекта у меня нет (Inventor 2015)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Строится все в градусах и мм.

Прям вот вобще удивлен, сложно даже представить почему такие единицы. Опыта работы с версией раньше 2017 у меня не было, а с нее и далее все было в радианах ))

CircularPatternFeatureDefinition - такого объекта у меня
Вы уверены, попробуйте залезть в CircularPatternFeatures. Вы используете функцию Add, которая этот definition по сути внутри себя создает, может у вас есть функция AddByDefinition (см. фото)



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

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Можете выложить объектную модель 2015 инвентора? Вроде бы вот так ее получить можно:

You can install the C:\Users\Public\Documents\Autodesk\Inventor 2015\SDK\DeveloperTools.msi and then find thethe \DeveloperTools\Docs\Inventor2015ObjectModel.pdf.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Попробуйте вот этот код запустить в родном VBA внутри инвентора.
В 100 строке (92 у вас) правильнее установить FitWithinAngle = false, но ошибку вам это вызывать не может по идее.

Update: решение в следующем сообщении )

Код - Visual Basic [Выбрать]
  1. Sub CircularPatternFeatures()
  2.  
  3.         Dim iApp As Inventor.Application
  4.         Set iApp = ThisApplication
  5.  
  6.         Dim oPart As PartDocument
  7.         Set oPart = iApp.Documents.Add(DocumentTypeEnum.kPartDocumentObject, iApp.FileManager.GetTemplateFile(DocumentTypeEnum.kPartDocumentObject))
  8.  
  9.         Dim oCompDef As PartComponentDefinition
  10.         Set oCompDef = oPart.ComponentDefinition
  11.  
  12.         With oPart.UnitsOfMeasure
  13.             .LengthUnits = UnitsTypeEnum.kMillimeterLengthUnits
  14.             .MassUnits = UnitsTypeEnum.kKilogramMassUnits
  15.             .AngleUnits = UnitsTypeEnum.kGradAngleUnits
  16.             .TimeUnits = UnitsTypeEnum.kSecondTimeUnits
  17.         End With
  18.  
  19.         Dim oSketch As PlanarSketch
  20.         Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
  21.  
  22.         Dim oTransGeom As TransientGeometry
  23.         Set oTransGeom = iApp.TransientGeometry
  24.  
  25.         Dim oSkPoint As SketchPoint
  26.         Set oSkPoint = oSketch.AddByProjectingEntity(oCompDef.WorkPoints(1))
  27.         Dim oSkLine1, oSkLine2 As SketchLine
  28.         Set oSkLine1 = oSketch.AddByProjectingEntity(oCompDef.WorkAxes.Item(1))
  29.         oSkLine1.Construction = False
  30.         Set oSkLine2 = oSketch.AddByProjectingEntity(oCompDef.WorkAxes.Item(2))
  31.         oSkLine2.Centerline = True
  32.         Dim oCoord1, oCoord0 As Point2d
  33.  
  34.         Set oCoord0 = oTransGeom.CreatePoint2d(0, 0)
  35.  
  36.         Dim oPoint0 As SketchPoint
  37.         Set oPoint0 = oSketch.SketchPoints.Add(oCoord0, True)
  38.  
  39.         Set oCoord1 = oTransGeom.CreatePoint2d(0, 0)
  40.         Dim oCoord2 As Point2d
  41.         Set oCoord2 = oTransGeom.CreatePoint2d(120, 0)
  42.         Dim oLines(0 To 3) As SketchLine
  43.         Set oLines(0) = oSketch.SketchLines.AddByTwoPoints(oPoint0, oCoord2)
  44.         Call oSketch.DimensionConstraints.AddTwoPointDistance(oLines(0).StartSketchPoint, oLines(0).EndSketchPoint, DimensionOrientationEnum.kAlignedDim, oCoord2, False)
  45.         Set oCoord1 = oTransGeom.CreatePoint2d(120, 20)
  46.         Set oLines(1) = oSketch.SketchLines.AddByTwoPoints(oLines(0).EndSketchPoint, oCoord1)
  47.         Call oSketch.DimensionConstraints.AddTwoPointDistance(oLines(1).StartSketchPoint, oLines(1).EndSketchPoint, DimensionOrientationEnum.kAlignedDim, oCoord1, False)
  48.         Set oCoord1 = oTransGeom.CreatePoint2d(70, 20)
  49.         Set oCoord2 = oTransGeom.CreatePoint2d(70, 70)
  50.         Dim oArc As SketchArc
  51.         Set oArc = oSketch.SketchArcs.AddByCenterStartEndPoint(oCoord1, oLines(1).EndSketchPoint, oCoord2)
  52.         Call oSketch.DimensionConstraints.AddRadius(oArc, oCoord1, False)
  53.  
  54.         Set oCoord1 = oTransGeom.CreatePoint2d(0, 70)
  55.  
  56.         Set oLines(2) = oSketch.SketchLines.AddByTwoPoints(oArc.EndSketchPoint, oCoord1)
  57.         Set oLines(3) = oSketch.SketchLines.AddByTwoPoints(oLines(0).StartSketchPoint, oLines(2).EndSketchPoint)
  58.  
  59.         Dim oPoint As SketchPoint
  60.         Set oPoint = oSketch.SketchPoints.Add(oCoord1, False)
  61.         Call oPoint.MoveTo(oTransGeom.CreatePoint2d(1, 71))
  62.  
  63.         Call oSketch.DimensionConstraints.AddTwoPointDistance(oLines(2).StartSketchPoint, oLines(2).EndSketchPoint, DimensionOrientationEnum.kAlignedDim, oCoord1, False)
  64.  
  65.         Call oSketch.GeometricConstraints.AddHorizontal(oLines(0))
  66.         Call oSketch.GeometricConstraints.AddPerpendicular(oLines(0), oLines(1))
  67.         Call oSketch.GeometricConstraints.AddTangent(oLines(1), oArc)
  68.         Call oSketch.GeometricConstraints.AddTangent(oLines(2), oArc)
  69.         Call oSketch.GeometricConstraints.AddParallel(oLines(0), oLines(2))
  70.         Call oSketch.GeometricConstraints.AddParallel(oLines(0), oSkLine1)
  71.  
  72.         Call oPoint0.MoveTo(oTransGeom.CreatePoint2d(1, 1))
  73.  
  74.         Dim oTextCoord As Point2d
  75.         Set oTextCoord = oTransGeom.CreatePoint2d(2, 2)
  76.         Call oSketch.DimensionConstraints.AddOffset(oSkLine2, oLines(0).StartSketchPoint, oTextCoord, True, False)
  77.         oSketch.DimensionConstraints.Item(oSketch.DimensionConstraints.Count).Parameter.Value = 35
  78.         Call oSketch.DimensionConstraints.AddOffset(oSkLine1, oLines(0).StartSketchPoint, oTextCoord, False, False)
  79.         oSketch.DimensionConstraints.Item(oSketch.DimensionConstraints.Count).Parameter.Value = 35
  80.  
  81.         Dim oPr As Profile
  82.         Set oPr = oSketch.Profiles.AddForSolid
  83.        
  84.         Dim PI As Double
  85.         PI = Atn(1) * 4
  86.        
  87.  
  88.         Dim oRevFeature, oRevFeature1 As RevolveFeature
  89.         Set oRevFeature = oCompDef.Features.RevolveFeatures.AddFull(oPr, oSkLine2, PartFeatureOperationEnum.kJoinOperation)
  90.         Set oRevFeature1 = oCompDef.Features.RevolveFeatures.AddByAngle(oPr, oSkLine2, PI / 9, PartFeatureExtentDirectionEnum.kSymmetricExtentDirection, PartFeatureOperationEnum.kCutOperation)
  91.  
  92.         Dim oObCol As ObjectCollection
  93.         Set oObCol = iApp.TransientObjects.CreateObjectCollection
  94.         Call oObCol.Add(oRevFeature1)
  95.         'до этой строки все работает с той лишь разницей, что добавил Set в присвоении, и углы поменял на радианы
  96.  
  97.         Dim definition As CircularPatternFeatureDefinition
  98.         Dim CPF As CircularPatternFeatures
  99.         Set CPF = oCompDef.Features.CircularPatternFeatures
  100.         Set definition = CPF.CreateDefinition(oObCol, oCompDef.WorkAxes.Item(2), False, 3, PI / 6, False)
  101.         Call CPF.AddByDefinition(definition)
  102.  
  103.         'Call oCompDef.Features.CircularPatternFeatures.Add(oObCol, oCompDef.WorkAxes.Item(2), False, 3, 30, False) '- массив вокруг оси Y
  104.        ''(Ошибка: System.Runtime.InteropServices.COMException :  "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))")
  105.        'oSketch.Visible = False
  106.  
  107. End Sub
  108.  
В программировании я новичок...но ненадолго! ;)