Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: R.I.Chernov от 06-09-2016, 16:22:18

Название: Как указать диаметр отверстия на чертеже?
Отправлено: R.I.Chernov от 06-09-2016, 16:22:18
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста с вопросом, указанным в теме. У меня есть пластина, в ней выдавливанием сделано отверстие. Необходимо на чертеже указать его диаметр. Не знаю с чего начать - не могу найти примеров. Буду благодарен любому совету / ссылочке на пример.
Название: Re: Как указать диаметр отвестия на чертеже?
Отправлено: mikazakov от 06-09-2016, 16:55:55
Необходимо на чертеже указать его диаметр.
Филат помнится писал похожий AddIn для автоматического образмеривания отверстий.
Название: Re: Как указать диаметр отвестия на чертеже?
Отправлено: R.I.Chernov от 06-09-2016, 17:09:57
Филат помнится писал похожий AddIn для автоматического образмеривания отверстий.
Ок, спасибо,еще  поищу в предыдущих темах
Название: Re: Как указать диаметр отвестия на чертеже?
Отправлено: R.I.Chernov от 06-09-2016, 17:49:06
Просмотрел все темы авторства filat-a не нашел :(
Название: Re: Как указать диаметр отверстия на чертеже?
Отправлено: mikazakov от 06-09-2016, 20:15:25
Просмотрел все темы авторства filat-a не нашел
Ну ч ж не говорил, что он об этом пишет где то, просто у него опыт есть с этим делом.
Вот что я нашел в хэлпе:

DrawingView.DrawingCurves( [ModelObject] As Variant ) As DrawingCurvesEnumerator

При этом, как то странно, это по сути функция, но описана как свойство из описания IDL-файла:
[id(0x07000433), propget, helpstring("Gets an enumerator of all drawing curves in this view optionally filtered to input model object"), helpcontext(0x07000433)]
            DrawingCurvesEnumerator* DrawingCurves([in, optional] VARIANT ModelObject);


Правда, IntelliSense её не показывает при наборе в текстовом редакторе кода.
Видимо косяк автодеска в описательной части объектной модели. Не смотря на это, эта функция работает корректно.

По все видимости нужно либо искать все кривые типа дугообразных или если отверстия сделаны командой "сверление" можно
получить сузить область поиска передав в DrawingCurves в качестве аргумента это отверстие из 3D-модели.
Название: Re: Как указать диаметр отверстия на чертеже?
Отправлено: R.I.Chernov от 07-09-2016, 18:35:13
Вот что я нашел в хэлпе:

DrawingView.DrawingCurves( [ModelObject] As Variant ) As DrawingCurvesEnumerator

Спасибо, я сам мусолю этот метод пол дня. Вот кстати лекция Владимира Ананьева, где он этот метод называл "свои любимым" :)
И вообще рекомендую - очень познавательная лекция на тему чертежей. К сожалению, за кадром остались куча ответов на  вопросы, которые были заданы из зала.

https://youtu.be/d9oTqNFyrqc?t=16m54s (https://youtu.be/d9oTqNFyrqc?t=16m54s)

В общем, с помощью него я получил коллекцию, состоящую из одной кривой, которая относится к выдавливанию, но не знаю, как дальше к ней привязать диаметр. И второй вопрос, что если бы у меня было не отверстие, а овальный пропил, который бы содержал не одну кривую. Как тогда определить, к какой из них обращаться.
Название: Re: Как указать диаметр отверстия на чертеже?
Отправлено: mikazakov от 07-09-2016, 18:44:49
но не знаю, как дальше к ней привязать диаметр
почитать хэлп на тему GeneralDimensions.AddDiameter

если бы у меня было не отверстие, а овальный пропил, который бы содержал не одну кривую. Как тогда определить, к какой из них обращаться.
ну нужно выробатать математический критерий, например, привязываемся только к максимальному. Или как то заранее пометить ребро через Edge.AttributeSets . По другому никак
Название: Re: Как указать диаметр отверстия на чертеже?
Отправлено: R.I.Chernov от 07-09-2016, 19:47:19
Пол дела сделано, размер ставится:
Код - Visual Basic [Выбрать]
  1. Private Sub test_dwg_99()
  2.         Dim oDoc_dwg As DrawingDocument
  3.         Set oDoc_dwg = ThisApplication.ActiveDocument
  4.         Dim oTG As TransientGeometry
  5.         Set oTG = ThisApplication.TransientGeometry
  6.         Dim oSheet As Sheet
  7.         Set oSheet = oDoc_dwg.ActiveSheet
  8.         Dim oView As DrawingView
  9.         Set oView = oSheet.DrawingViews(1)
  10.        
  11.         Dim oDoc As AssemblyDocument
  12.         Set oDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
  13.         Dim oCD As AssemblyComponentDefinition
  14.         Set oCD = oDoc.ComponentDefinition
  15.         Dim oOcc As ComponentOccurrence
  16.         Set oOcc = oCD.Occurrences.ItemByName("Part1")
  17.         Dim oCD_pt As PartComponentDefinition
  18.         Set oCD_pt = oCD.Occurrences.ItemByName("Part1").Definition
  19.         Dim oExtr As ExtrudeFeature
  20.         Set oExtr = oCD_pt.Features.ExtrudeFeatures("Extr_hole")
  21.         Dim oExtrProxy As ExtrudeFeatureProxy
  22.         oOcc.CreateGeometryProxy oExtr, oExtrProxy
  23.    
  24.         Dim oCurves As DrawingCurvesEnumerator
  25.         Set oCurves = oView.DrawingCurves(oExtrProxy)
  26.        
  27.         Dim oGI_1 As GeometryIntent
  28.         Set oGI_1 = oSheet.CreateGeometryIntent(oCurves(1))
  29.         Call oSheet.DrawingDimensions.GeneralDimensions.AddDiameter(oTG.CreatePoint2d(10, 10), oGI_1)
  30.     End Sub
Остается вопрос с позиционированием. Думаю, чтобы адекватно использовать постановку диаметра, необходимо завязываться на центр отверстия, но вот не знаю как это сделать. Есть какие идеи?

П.С. Как мне показалось (не уверен, что правильно перевел хелп), если в методе Sheet.CreateGeometryIntent( Geometry As Object, [Intent] As Variant )  правильно поставить второй аргумент, то можно получить центр кривой в формате Point2D. Как уже указал выше, сделать это у меня пока не получилось. Буду признателен за любой совет.
Название: Re: Как указать диаметр отверстия на чертеже?
Отправлено: mikazakov от 08-09-2016, 09:26:38
необходимо завязываться на центр отверстия, но вот не знаю как это сделать.

Допустим на втором виде есть окружность с порядковым номер 5 в коллекции кривых вида, тогда цент находится:
Код - Visual Basic [Выбрать]
  1. Sub Main()
  2.  
  3. Dim Doc As DrawingDocument
  4. Set Doc = ThisApplication.ActiveDocument
  5. Dim dcs As DrawingCurvesEnumerator
  6. Set dcs = Doc.ActiveSheet.DrawingViews(2).DrawingCurves()
  7.  
  8. Dim dc As DrawingCurve
  9. Set dc = dcs(5)
  10.  
  11. Dim cp As Point2d
  12. Set cp = dc.CenterPoint
  13.  
  14. Debug.Print cp.X
  15. Debug.Print cp.Y
  16.  
  17. End Sub
  18.  

не забываем, что координаты даны в сантиметрах
Название: Re: Как указать диаметр отверстия на чертеже?
Отправлено: R.I.Chernov от 08-09-2016, 13:21:34
не забываем, что координаты даны в сантиметрах
:) Спасибо, Михаил, за ценную информацию!
Ну а если серьезно, вы очень помогли, собственно как всегда, и я вам очень благодарен. Ниже предлагаю всем результат нашего совестного труда:
Код - Visual Basic [Выбрать]
  1. Private Sub test_dwg_10()
  2.     Dim oDoc_dwg As DrawingDocument
  3.     Set oDoc_dwg = ThisApplication.ActiveDocument
  4.     Dim oTG As TransientGeometry
  5.     Set oTG = ThisApplication.TransientGeometry
  6.     Dim oSheet As Sheet
  7.     Set oSheet = oDoc_dwg.ActiveSheet
  8.     Dim oView As DrawingView
  9.     Set oView = oSheet.DrawingViews(1)
  10.    
  11.     Dim oDoc As AssemblyDocument
  12.     Set oDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
  13.     Dim oCD As AssemblyComponentDefinition
  14.     Set oCD = oDoc.ComponentDefinition
  15.     Dim oOcc As ComponentOccurrence
  16.     Set oOcc = oCD.Occurrences.ItemByName("Part1")
  17.     Dim oCD_pt As PartComponentDefinition
  18.     Set oCD_pt = oCD.Occurrences.ItemByName("Part1").Definition
  19.     Dim oExtr As ExtrudeFeature
  20.     Set oExtr = oCD_pt.Features.ExtrudeFeatures("Extr_hole")
  21.     Dim oExtrProxy As ExtrudeFeatureProxy
  22.     oOcc.CreateGeometryProxy oExtr, oExtrProxy
  23.    
  24.     Dim oCurves As DrawingCurvesEnumerator
  25.     Set oCurves = oView.DrawingCurves(oExtrProxy)
  26.     Dim oCurve As DrawingCurve
  27.     Set oCurve = oCurves(1)
  28.    
  29.     Dim hole_dia As Double: Dim dwg_scale As Double: Dim real_hole_dia As Double
  30.     hole_dia = 25
  31.     dwg_scale = 1 / 10
  32.     real_hole_dia = hole_dia * dwg_scale
  33.    
  34.     Dim oPoint As Point2d
  35.     Set oPoint = oTG.CreatePoint2d(oCurve.CenterPoint.X + real_hole_dia / 2, oCurve.CenterPoint.Y + real_hole_dia / 2)
  36.     Dim oGI_1 As GeometryIntent
  37.     Set oGI_1 = oSheet.CreateGeometryIntent(oCurves(1))
  38.     Call oSheet.DrawingDimensions.GeneralDimensions.AddDiameter(oPoint, oGI_1, , True, False)
  39. End Sub