Как указать диаметр отверстия на чертеже?

Автор Тема: Как указать диаметр отверстия на чертеже?  (Прочитано 7571 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста с вопросом, указанным в теме. У меня есть пластина, в ней выдавливанием сделано отверстие. Необходимо на чертеже указать его диаметр. Не знаю с чего начать - не могу найти примеров. Буду благодарен любому совету / ссылочке на пример.
« Последнее редактирование: 06-09-2016, 19:11:33 от Александр Ривилис »
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Необходимо на чертеже указать его диаметр.
Филат помнится писал похожий AddIn для автоматического образмеривания отверстий.

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Филат помнится писал похожий AddIn для автоматического образмеривания отверстий.
Ок, спасибо,еще  поищу в предыдущих темах
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Просмотрел все темы авторства filat-a не нашел :(
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Просмотрел все темы авторства 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-модели.

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Вот что я нашел в хэлпе:

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

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

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

В общем, с помощью него я получил коллекцию, состоящую из одной кривой, которая относится к выдавливанию, но не знаю, как дальше к ней привязать диаметр. И второй вопрос, что если бы у меня было не отверстие, а овальный пропил, который бы содержал не одну кривую. Как тогда определить, к какой из них обращаться.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
но не знаю, как дальше к ней привязать диаметр
почитать хэлп на тему GeneralDimensions.AddDiameter

если бы у меня было не отверстие, а овальный пропил, который бы содержал не одну кривую. Как тогда определить, к какой из них обращаться.
ну нужно выробатать математический критерий, например, привязываемся только к максимальному. Или как то заранее пометить ребро через Edge.AttributeSets . По другому никак

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Пол дела сделано, размер ставится:
Код - 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. Как уже указал выше, сделать это у меня пока не получилось. Буду признателен за любой совет.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
необходимо завязываться на центр отверстия, но вот не знаю как это сделать.

Допустим на втором виде есть окружность с порядковым номер 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.  

не забываем, что координаты даны в сантиметрах

Отмечено как Решение R.I.Chernov 08-09-2016, 13:21:58

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
не забываем, что координаты даны в сантиметрах
:) Спасибо, Михаил, за ценную информацию!
Ну а если серьезно, вы очень помогли, собственно как всегда, и я вам очень благодарен. Ниже предлагаю всем результат нашего совестного труда:
Код - 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
В программировании я новичок...но ненадолго! ;)