Не получается поставить размер

Автор Тема: Не получается поставить размер  (Прочитано 8996 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста найти ошибку в коде, который приведу ниже. В двух словах: у меня есть деталь куб, она вставлена в сборку, в две вершины куба в сборке помещаются рабочие точки. Со сборки сделан вид. Рабочие точки это верхние левая и правая вершина куба на виде.

Код - Visual Basic [Выбрать]
  1. Private Sub test_dwg_4()
  2.     Dim oDoc_dwg As DrawingDocument
  3.     Set oDoc_dwg = ThisApplication.ActiveDocument
  4.     Dim oSheet As Sheet
  5.     Set oSheet = oDoc_dwg.ActiveSheet
  6.     Dim oView As DrawingView
  7.     Set oView = oSheet.DrawingViews(1)
  8.    
  9.     Dim oDoc As AssemblyDocument
  10.     Set oDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
  11.     Dim oCD As AssemblyComponentDefinition
  12.     Set oCD = oDoc.ComponentDefinition
  13.    
  14.     Dim oWP_1 As WorkPoint
  15.     Dim oWP_2 As WorkPoint
  16.     Set oWP_1 = oCD.WorkPoints("WPoint_1")
  17.     Set oWP_2 = oCD.WorkPoints("WPoint_2")
  18.    
  19.     Dim oTG As TransientGeometry
  20.     Set oTG = ThisApplication.TransientGeometry
  21.     oView.Center = oTG.CreatePoint2d(15, 45)
  22.     Debug.Print oView.Center.X & "," & oView.Center.Y
  23.     Call oSheet.DrawingDimensions.GeneralDimensions.AddLinear(oTG.CreatePoint2d(15, 51), oWP_1, oWP_2, kHorizontalDimensionType)
  24. End Sub

В последней строке ошибка: " Type mismatch"
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Не получается поставить размер
« Ответ #1 : 02-09-2016, 17:34:14 »
Покопался еще, быть может код на конце должен выглядеть так:
Код - Visual Basic [Выбрать]
  1.  Dim oLenearDimens_1 As LinearGeneralDimension
  2.  Set oLenearDimens_1 = oSheet.DrawingDimensions.GeneralDimensions.AddLinear(oTG.CreatePoint2d(15, 51), oWP_1, oWP_2, kHorizontalDimensionType)

Но все равно не работает :(
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #2 : 03-09-2016, 06:04:38 »
В последней строке ошибка: " Type mismatch"
В хэлпе:
GeneralDimensions.AddLinear( TextOrigin As Point2d, IntentOne As GeometryIntent, [IntentTwo] As Variant, [DimensionType] As DimensionTypeEnum, [ArrowheadsInside] As Boolean, [DimensionStyle] As Variant, [Layer] As Variant ) As LinearGeneralDimension

В сигнатуре есть параметр: [IntentTwo] As Variant
Хэлп по поводу этого параметра говорит:
Object that specifies the first geometry to dimension. The GeometryIntent object can be created using the CreateGeometryIntent method on the Sheet object.
т.е. на прямую объекты нельзя подсовывать, с начала нужно создать объект GeometryIntent, через Sheet.CreateGeometryIntent, только я с налету не понял что в этот метод подпихивать, либо саму рабочую точку с 3D-модели, но вероятнее всего проекцию этой точки с чертежа.
На странице хелпа с Sheet.CreateGeometryIntent будут ссылки на примеры.
Как я уже сказал, с налету у меня не получилось, нужно сидеть и колупать. Если не получится разобраться, то при удобном случае могу вечерком часок тоже посидеть по колупать.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Не получается поставить размер
« Ответ #3 : 05-09-2016, 14:01:40 »
Спасибо, Михаил!

Попробовал создать GeometryIntent с рабочей точки:
Код - Visual Basic [Выбрать]
  1. Dim oGInt_1 As GeometryIntent
  2. Set oGInt_1 = oSheet.CreateGeometryIntent(oWP_1)
  3. Debug.Print oGInt_1.IntentType

Debug.Print выдает значение  58117, что в хелпе описывается как:
The GeometryIntent is not a point and the Intent property will not return a meaningful value.
Судя по всему вы правы, и привяываться напрямую к геометрии не получится, только к проекциям.

Буду признателен, если кто-то подскажет, как проецировать :)
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Не получается поставить размер
« Ответ #4 : 05-09-2016, 16:02:34 »
Хотя нашел вот такой пример, вроде бы то что нужно, пока не разобрался до конца:
http://forums.autodesk.com/t5/inventor-customization/inventor-api-create-dimension-from-2-workpoints-in-an-idw/m-p/3159062/highlight/true#M36155
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #5 : 05-09-2016, 18:37:18 »
Буду признателен, если кто-то подскажет, как проецировать

Вот работающий код для чертежа детали, деталь и чертеж во вложении:

Код - Visual Basic [Выбрать]
  1. Private Sub test()
  2.     Dim oDoc_dwg As DrawingDocument
  3.     Set oDoc_dwg = ThisApplication.ActiveDocument
  4.     Dim oSheet As Sheet
  5.     Set oSheet = oDoc_dwg.ActiveSheet
  6.     Dim oView As DrawingView
  7.     Set oView = oSheet.DrawingViews(1)
  8.    
  9.     Dim oDoc As PartDocument
  10.     Set oDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
  11.     Dim oCD As PartComponentDefinition
  12.     Set oCD = oDoc.ComponentDefinition
  13.    
  14.     Dim oWP_1 As WorkPoint
  15.     Dim oWP_2 As WorkPoint
  16.     Set oWP_1 = oCD.WorkPoints("Work Point1")
  17.     Set oWP_2 = oCD.WorkPoints("Work Point2")
  18.    
  19.    Call oView.SetIncludeStatus(oWP_1, True)
  20.     Call oView.SetIncludeStatus(oWP_2, True)
  21.    
  22.     Dim gi1 As GeometryIntent
  23.     Dim gi2 As GeometryIntent
  24.     Set gi1 = oSheet.CreateGeometryIntent(oSheet.Centermarks(1), kPoint2dIntent)
  25.      Set gi2 = oSheet.CreateGeometryIntent(oSheet.Centermarks(2), kPoint2dIntent)
  26.     '
  27.    Dim oTG As TransientGeometry: Set oTG = ThisApplication.TransientGeometry
  28.    
  29.     Dim linDim As LinearGeneralDimension  
  30.     Set linDim = oSheet.DrawingDimensions.GeneralDimensions.AddLinear(oTG.CreatePoint2d(10, 10), gi1, gi2, kHorizontalDimensionType)
  31.        
  32. End Sub

Для работы с чертежом сборки есть одна тонкость, если нужно привязаться размером к геометрии из детали или подсборки то нужно сначала создать прокси-объект с это геометрии через функцию:
ComponentOccurrence.CreateGeometryProxy

И работать с полученным прокси-объектом, иначе будет генерироваться ошибка

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Не получается поставить размер
« Ответ #6 : 06-09-2016, 13:46:21 »
Спасибо, Михаил. Мне вот не совсем понятно назначение 2 аргумента метода CreateGeometryIntent:
   
Код - Visual Basic [Выбрать]
  1. Set gi1 = oSheet.CreateGeometryIntent(oSheet.Centermarks(1), kPoint2dIntent)
  2. Set gi2 = oSheet.CreateGeometryIntent(oSheet.Centermarks(2), kPoint2dIntent)
Я написал аналогичный код, и даже если убрать аргументы "kPoint2dIntent" - он работает.

Для работы с чертежом сборки есть одна тонкость, если нужно привязаться размером к геометрии из детали или подсборки то нужно сначала создать прокси-объект с это геометрии через функцию:
ComponentOccurrence.CreateGeometryProxy
Мне, наверное, это и нужно, потому как обращаться к точкам через индекс в коллекции Sheet.Centermarks у меня вряд ли получится, слишком сложно отследить правильные индексы. Я добавил осевую линию центра отверстий, до проецирования точек в коде, и все - код не работает.... ну точнее одной из точек привязки становится центр этого отверстия, так как она поместилась в коллекцию с индексом "1".
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Не получается поставить размер
« Ответ #7 : 06-09-2016, 14:29:55 »
Мне, наверное, это и нужно
Чушь написал ...  Я наконец въехал зачем прокси нужно - для доступа к нижним уровням сборок?! Т.е. искользование прокси точек от использования обычных по сути ничем не отличается? А жаль ... Потому как мне это не подходит. У меня цель привязаться к конкретным двум точкам, чьи имена я знаю. Быть может есть способ отследить ссылки коллекции Sheet.Centermarks() для определения связи с конкретной "нужной" точкой?
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 06-09-2016, 15:32:39

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Не получается поставить размер
« Ответ #8 : 06-09-2016, 15:32:34 »
Разобрался, еще раз спасибо, Михаил, за помощь:
(Update1 - написал код и для обычных точек, и для прокси. Надеюсь, что кому-нибудь пригодится)
Код - Visual Basic [Выбрать]
  1. Private Sub test_dwg_6()
  2.         Dim oDoc_dwg As DrawingDocument
  3.         Set oDoc_dwg = ThisApplication.ActiveDocument
  4.         Dim oSheet As Sheet
  5.         Set oSheet = oDoc_dwg.ActiveSheet
  6.         Dim oView As DrawingView
  7.         Set oView = oSheet.DrawingViews(1)
  8.         Dim oDoc As AssemblyDocument
  9.         Set oDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
  10.         Dim oCD As AssemblyComponentDefinition
  11.         Set oCD = oDoc.ComponentDefinition
  12.         Dim oTG As TransientGeometry
  13.         Set oTG = ThisApplication.TransientGeometry
  14.        
  15.         Dim oWP_1 As WorkPoint: Dim oWP_2 As WorkPoint: Dim oWP_3 As WorkPoint: Dim oWP_4 As WorkPoint
  16.         Dim oWorkPointProx3 As Inventor.WorkPointProxy: Dim oWorkPointProx4 As Inventor.WorkPointProxy
  17.        
  18.         Set oWP_3 = oCD.Occurrences.ItemByName("Part1").Definition.WorkPoints("WPoint_3")
  19.         Set oWP_4 = oCD.Occurrences.ItemByName("Part1").Definition.WorkPoints("WPoint_4")
  20.         Set oWP_1 = oCD.WorkPoints("WPoint_1")
  21.         Set oWP_2 = oCD.WorkPoints("WPoint_2")
  22.         Set oWP_3 = oCD.Occurrences.ItemByName("Part1").Definition.WorkPoints("WPoint_3")
  23.         Set oWP_4 = oCD.Occurrences.ItemByName("Part1").Definition.WorkPoints("WPoint_4")
  24.         oCD.Occurrences(1).CreateGeometryProxy oWP_3, oWorkPointProx3
  25.         oCD.Occurrences(1).CreateGeometryProxy oWP_4, oWorkPointProx4
  26.         Call oView.SetIncludeStatus(oWP_1, True)
  27.         Call oView.SetIncludeStatus(oWP_2, True)
  28.         Call oView.SetIncludeStatus(oWorkPointProx3, True)
  29.         Call oView.SetIncludeStatus(oWorkPointProx4, True)
  30.         Call oView.SetVisibility(oWP_1, False)
  31.         Call oView.SetVisibility(oWP_2, False)
  32.         Call oView.SetVisibility(oWorkPointProx3, False)
  33.         Call oView.SetVisibility(oWorkPointProx4, False)
  34.        
  35.        
  36.         Dim oCMark_1 As Centermark: Dim oCMark_2 As Centermark: Dim oCMark_3 As Centermark: Dim oCMark_4 As Centermark
  37.        
  38.         Dim i As Integer
  39.         For i = 1 To oSheet.Centermarks.Count
  40.             If oSheet.Centermarks(i).AttachedEntity Is oWP_1 Then
  41.             Set oCMark_1 = oSheet.Centermarks(i)
  42.             Debug.Print "Точка 1 нашлась"
  43.             End If
  44.             If oSheet.Centermarks(i).AttachedEntity Is oWP_2 Then
  45.             Set oCMark_2 = oSheet.Centermarks(i)
  46.             Debug.Print "Точка 2 нашлась"
  47.             End If
  48.             If oSheet.Centermarks(i).AttachedEntity Is oWorkPointProx3 Then
  49.             Set oCMark_3 = oSheet.Centermarks(i)
  50.             Debug.Print "Точка 3 нашлась"
  51.             End If
  52.             If oSheet.Centermarks(i).AttachedEntity Is oWorkPointProx4 Then
  53.             Set oCMark_4 = oSheet.Centermarks(i)
  54.             Debug.Print "Точка 4 нашлась"
  55.             End If
  56.         Next
  57.        
  58.         Dim oGI_1 As GeometryIntent: Dim oGI_2 As GeometryIntent: Dim oGI_3 As GeometryIntent: Dim oGI_4 As GeometryIntent:
  59.         Set oGI_1 = oSheet.CreateGeometryIntent(oCMark_1, kPoint2dIntent)
  60.         Set oGI_2 = oSheet.CreateGeometryIntent(oCMark_2, kPoint2dIntent)
  61.         Set oGI_3 = oSheet.CreateGeometryIntent(oCMark_3, kPoint2dIntent)
  62.         Set oGI_4 = oSheet.CreateGeometryIntent(oCMark_4, kPoint2dIntent)
  63.        
  64.         Dim oPoint_1 As Point2d: Dim oPoint_2 As Point2d
  65.         Set oPoint_1 = oTG.CreatePoint2d(oView.Center.X, oView.Center.Y + oView.Height / 2 + 1)
  66.         Set oPoint_2 = oTG.CreatePoint2d(oView.Center.X + oView.Height / 2 + 1, oView.Center.Y)
  67.         Call oSheet.DrawingDimensions.GeneralDimensions.AddLinear(oPoint_1, oGI_1, oGI_2, kHorizontalDimensionType)
  68.         Call oSheet.DrawingDimensions.GeneralDimensions.AddLinear(oPoint_2, oGI_3, oGI_4, kVerticalDimensionType)
  69.     End Sub
В программировании я новичок...но ненадолго! ;)

Оффлайн Vyacheslav

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не получается поставить размер
« Ответ #9 : 20-03-2021, 14:31:00 »
Доброго дня.
Мы бьёмся уже не один день над кодом для постановки размера в чертеж. Прочитал на форуме ваши сообщения. Наша проблема: мы не можем из детали находящейся в подсборке спроецировать рабочую точку в сборку (прокси объект). С функцией "ComponentOccurrence.CreateGeometryProxy" не получается. Можете на примере показать как правильно создать прокси объект.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #10 : 20-03-2021, 14:44:51 »
Ну для начала нужно ваш самый простенький пример, без наворотов и пример что на чертеже должно быть.

Оффлайн Vyacheslav

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не получается поставить размер
« Ответ #11 : 20-03-2021, 15:32:30 »
Во вложениях череж и простая сборка. На чертеже в принципе все что хотелось бы сделать программно, включая разрыв.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #12 : 21-03-2021, 09:03:15 »
мы не можем из детали находящейся в подсборке спроецировать рабочую точку в сборку (прокси объект)
Рабочую точку на сборочный чертеж может быть?
Если да то там, она на прямую не проецируется, судя по пользовательским инструментам на чертеже создается маркер центра, т.е.
нужно делать через
Centermarks.AddByWorkFeature
и там подставлять прокси точку.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #13 : 21-03-2021, 09:04:32 »
На чертеже в принципе все что хотелось бы сделать программно, включая разрыв.
Там пример в хэлпе есть. Но в таких случаях трудно запозиционировать место разрыва, критерий должен быть какой то однозначный.

Код - Visual Basic [Выбрать]
  1. Public Sub CreateBreakoperationInDrawingView()
  2.     ' Set a reference to the drawing document.
  3.    ' This assumes a drawing document is active.
  4.    Dim oDrawDoc As DrawingDocument
  5.     Set oDrawDoc = ThisApplication.ActiveDocument
  6.  
  7.     'Set a reference to the active sheet.
  8.    Dim oSheet As Sheet
  9.     Set oSheet = oDrawDoc.ActiveSheet
  10.  
  11.     ' Check to make sure a drawing view is selected.
  12.    If Not TypeOf oDrawDoc.SelectSet.Item(1) Is DrawingView Then
  13.         MsgBox "A drawing view must be selected."
  14.         Exit Sub
  15.     End If
  16.  
  17.     ' Set a reference to the selected drawing. This assumes
  18.    ' that the selected view is not a draft view.
  19.    Dim oDrawingView As DrawingView
  20.     Set oDrawingView = oDrawDoc.SelectSet.Item(1)
  21.  
  22.     ' Set a reference to the center of the base view.
  23.    Dim oCenter As Point2d
  24.     Set oCenter = oDrawingView.Center
  25.  
  26.     ' Define the start point of the break
  27.    Dim oStartPoint As Point2d
  28.     Set oStartPoint = ThisApplication.TransientGeometry.CreatePoint2d(oCenter.X - 1, oCenter.Y)
  29.  
  30.     ' Define the end point of the break
  31.    Dim oEndPoint As Point2d
  32.     Set oEndPoint = ThisApplication.TransientGeometry.CreatePoint2d(oCenter.X + 1, oCenter.Y)
  33.  
  34.     Dim oBreakOperation As BreakOperation
  35.     Set oBreakOperation = oDrawingView.BreakOperations.Add(kHorizontalBreakOrientation, oStartPoint, oEndPoint, kRectangularBreakStyle, 5)
  36. End Sub

Оффлайн Vyacheslav

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не получается поставить размер
« Ответ #14 : 21-03-2021, 12:23:54 »
Если да то там, она на прямую не проецируется, судя по пользовательским инструментам на чертеже создается маркер центра,
в некоторых случаях мне достаточно маркера центра. Но точки на чертеже тоже необходимы.
Размеры между точками на чертеже преобладают, Поэтому хотелось бы и с прокси-точками разобраться.



С разрывом разобрался, большое спасибо. Если я правильно понимаю то с  разрывами не так просто. Если на виде несколько разрывов, то надо вычислять, сколько надо вырезать что-бы вид вписать в определённую область чертежа?

Оффлайн Vyacheslav

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не получается поставить размер
« Ответ #15 : 22-03-2021, 14:27:07 »
Centermarks.AddByWorkFeature
Все получилось. Спасибо большое

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #16 : 22-03-2021, 17:28:57 »
Я понимаю вопрос снят.

Оффлайн Vyacheslav

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не получается поставить размер
« Ответ #17 : 22-03-2021, 20:24:23 »
С нанесением размеров, полностью. Пол года бились безуспешно... Теперь получилось.  Попытаемся решить проблему с разрывами. Проблема- в детали несколько не одинаковых разрывов, и нужно вписать в отведенную область  чертежа. Будем вырешивать из таблицы точек арифметически...  Больше пока нет идей.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #18 : 23-03-2021, 05:20:00 »
Да, это нужно найти математический критерий, а это бывает не просто.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Не получается поставить размер
« Ответ #19 : 23-03-2021, 05:21:28 »
Vyacheslav,
Что вы там такое хоть изобретаете? Если это не коммерческая тайна конечно.

Оффлайн Vyacheslav

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не получается поставить размер
« Ответ #20 : 23-03-2021, 12:48:05 »
Да собственно нет никакой тайны. Делаем чертежи металлоконструкций из собственных профилей. Полтора года назад окунулся сначала в iLogik а затем и в Macros. Опыта программирования не было, да и сейчас как такового нет. Идем методом проб и ошибок. Всегда вместе с профессиональным программистом у которого опыта работы в Инвентор вообще нет. Исходные данные считываем из HML, сторим сборку, делаем деталировку. Все с помощью кода. Необходимости правки чертежа ручную нет. Не могли продвинуться дальше с чертежом сборки. Даже люди с AutoDesk нам не помогли. Наверное они были далеки от API.
Благодаре твоей подсказке получилось. Наша ошибка была в том что мы делали Прокси объект но не поднимали его до верхнего уровня. Теперь будем заниматься доводкой до ума. Цель - исключить правку чертежа вручную. Потом будем пробовать делать  надстройку для Инвентор.