Перейти к публикации

Рекомендованные сообщения

Добрый день подскажите пожалуйста как получить компонент по его имени?

 

Есть сборка из нескольких десятков деталей и сборок, есть макрос который подсчитывает все детали сборки и записывает в текстовый массив данные имя компонента, его количество и активную конфигурацию.

Далее мне нужно поработать с каждым компонентом имя которого записано в массив.

 

То есть мне нужно метод обратный методу GetPathName() - он пулучает имя объекта, а теперь по этому имени мне нужно получить компонент.

 

Кто может помогите пожалуйста.

Ссылка на сообщение
Поделиться на других сайтах


Уважаемые гуру програмирования artem_cad и streamdawn. Если Вас не затруднит посмотрите пожалуйста сборку. В этой сборке есть деталь "Стенка задняя" которая вызывает фатальную ошибку при обновлении списка вырезов.

При применении в макросе.

 

swFolder.UpdateCutList

 

Возникает критическая ошибка в некоторых деталях проекта. И такая проблема возникает не в одном проекте и у разных деталей.

 

Можно ли это как то побороть (кроме отказа от этого метода)? Хотелось бы всетаки перед считыванием свойств списка вырезов их обновить, а затем считывать.

 

SW Premium 2015x64 S.P.2.1

Тумба.rar

Ссылка на сообщение
Поделиться на других сайтах

Эта проблема исчезает только при принудительном ручном заходе в свойства списка вырезов. При этом он обновляется и далее деталь нормально реагирует на  UpdateCutList.

Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте,

Убедитесь, что указатель на IFeature находится в правильном контексте. Если Вы работаете со сборкой, то тогда этот элемент должен быть получен через цепочку IComponent2::FirstFeature->IFeature::GetNext, а не IComponent2::GetModelDoc2->IModelDoc2::FirstFeature->IFeature::GetNext. Самым простым методом проверить будет вызвать IFeature2::Select2 для Вашей папки вырезов и убедится, что он выделяет в активном документе.

 

Я бы еще посоветовал создать макрос, который только перебирает все вырезы и обновляет их, возможно проблема в других методах.

 

Самой распространенной проблемой крэша/критической ошибки SolidWorks является неправильное использование контекстов. Вот моя старая статья о контекстах (на английском): https://6f238b4e1c2c0fe8aba9812a0e640c75e4d59d35.googledrive.com/host/0B02PRaBhw43AOHItYjctZTR0WTg/assembly_and_part_contexts.html

 

Насколько я понял, критическая ошибка у Вас не вызывает крэш? А если Вы сделаете ctrl+Q она уходит? Возможно проблема в обновлении.

Изменено пользователем artem_cad
Ссылка на сообщение
Поделиться на других сайтах

Добрый день.

Подскажите пожалуйста! 

Имеется зеркально отражённый компонент (в нем появилась дополнительная конфигурация (в виде иерархии т.е у нее есть родительская конфигурация могу получить ее так: в цикле swConf.GetParent) )

Но при попытке получить активную конфигурацию получаю неожиданный результат:

?swComp.Name, swComp.GetModelDoc2.ConfigurationManager.ActiveConfiguration.Name

D.3456rgh-5       Зеркально отразитьПо умолчанию

D.3456rgh-1       Зеркально отразитьПо умолчанию
Или обе "По умолчанию" (то есть какая первая деталь попадется!)
 
А должна быть одна конфигурация с именем "По умолчанию" (это происходит только когда прохожу по деталям в контексте сборки )
 
Изменено пользователем Homasters
Ссылка на сообщение
Поделиться на других сайтах

Попробуйте swComp.ReferencedConfiguration ссылка http://help.solidworks.com/2012/English/api/sldworksapi/SolidWorks.interop.sldworks~SolidWorks.interop.sldworks.IComponent2~ReferencedConfiguration.html

Добрый день.

Подскажите пожалуйста!

Имеется зеркально отражённый компонент (в нем появилась дополнительная конфигурация (в виде иерархии т.е у нее есть родительская конфигурация могу получить ее так: в цикле swConf.GetParent) )

Но при попытке получить активную конфигурацию получаю неожиданный результат:

?swComp.Name, swComp.GetModelDoc2.ConfigurationManager.ActiveConfiguration.Name
D.3456rgh-5 Зеркально отразитьПо умолчанию

D.3456rgh-1 Зеркально отразитьПо умолчанию

Или обе "По умолчанию" (то есть какая первая деталь попадется!)

А должна быть одна конфигурация с именем "По умолчанию" (это происходит только когда прохожу по деталям в контексте сборки )

Изменено пользователем artem_cad
Ссылка на сообщение
Поделиться на других сайтах
Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте,

Убедитесь, что указатель на IFeature находится в правильном контексте. Если Вы работаете со сборкой, то тогда этот элемент должен быть получен через цепочку IComponent2::FirstFeature->IFeature::GetNext, а не IComponent2::GetModelDoc2->IModelDoc2::FirstFeature->IFeature::GetNext. Самым простым методом проверить будет вызвать IFeature2::Select2 для Вашей папки вырезов и убедится, что он выделяет в активном документе.

 

Я бы еще посоветовал создать макрос, который только перебирает все вырезы и обновляет их, возможно проблема в других методах.

 

Самой распространенной проблемой крэша/критической ошибки SolidWorks является неправильное использование контекстов. Вот моя старая статья о контекстах (на английском): https://6f238b4e1c2c0fe8aba9812a0e640c75e4d59d35.googledrive.com/host/0B02PRaBhw43AOHItYjctZTR0WTg/assembly_and_part_contexts.html

 

Насколько я понял, критическая ошибка у Вас не вызывает крэш? А если Вы сделаете ctrl+Q она уходит? Возможно проблема в обновлении.

Я в очередной раз Вам очень благодарен за ответ на форуме. Но к сожалению половину не понял. Если Вас не затруднит могли бы Вы объяснить эту цепочку

 

"Вы работаете со сборкой, то тогда этот элемент должен быть получен через цепочку IComponent2::FirstFeature->IFeature::GetNext, а не IComponent2::GetModelDoc2->IModelDoc2::FirstFeature->IFeature::GetNext. Самым простым методом проверить будет вызвать IFeature2::Select2 для Вашей папки вырезов и убедится, что он выделяет в активном документе."

 

У меня в макросе цепочка следующаяя

 

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim Massiv() As Variant

---------------------------------------------------------------------------------------------------------------------

Sub main()

 

      Set swApp = Application.SldWorks
      Set swModel = swApp.ActiveDoc
      boolstatus = swModel.EditRebuild3()

      .......

      Massiv = CreateArray(swModel)

      TraverseAssembly swModel, Massiv

      ......

End Sub

---------------------------------------------------------------------------------------------------------------------

Function CreateArray(swAssy As SldWorks.AssemblyDoc)

 

     Dim vComps As Variant

     Dim swComp As SldWorks.Component2

     ......

     vComps = swAssy.GetComponents(False)

     For i = 0 To UBound(vComps)

          Set swComp = vComps(i)

          ......

          Set Massiv(20, line) = swComp

          ......

     Next

     CreateArray = Massiv

End Function

---------------------------------------------------------------------------------------------------------------------

Sub TraverseAssembly(swAssy As SldWorks.AssemblyDoc, Massiv)
 
    Dim swComp As SldWorks.Component2
    .........
    For i = 0 To UBound(Massiv, 2)
        Set swComp = Massiv(20, i)
        ReadProperties swComp.FirstFeature, swComp.GetModelDoc2(), swComp.ReferencedConfiguration, Massiv, i
    Next
End Sub

---------------------------------------------------------------------------------------------------------------------

Function ReadProperties(swFeat As SldWorks.Feature, swModel As SldWorks.ModelDoc2, confName As String, Massiv, i)

          

          Dim swFolder As SldWorks.BodyFolder

          .......

          swFolder = swFeat.GetSpecificFeature2

          boolstatus = swFolder.UpdateCutList() '<<<-- Критическая ошибка с закрытием Солида

          ......

End Function

---------------------------------------------------------------------------------------------------------------------

Ссылка на сообщение
Поделиться на других сайтах

Впервые столкнулся с формами в VBA. Возникла проблема. Подскажите пожалуйста ка данные из TextBox вернуть в основной метод main

 

[Modules]

Dim swApp As Object
Dim Kol_vo As String
Sub main()
    Set swApp = Application.SldWorks
    Koll.Show
    Debug.Print Kol_vo
End Sub
 
[Forms]
Private Sub CommandButton1_Click()
    Unload Me
End Sub
 
Private Sub TextBox1_Change()
 
    Kol_vo = Koll.TextBox1.Text
End Sub
 
Private Sub UserForm_Click()
 
End Sub
 

Как переменную Kol_vo вернуть в основной метод main для ее дальнейшего использования в расчетах. 

Ссылка на сообщение
Поделиться на других сайтах

Впервые столкнулся с формами в VBA. Возникла проблема. Подскажите пожалуйста ка данные из TextBox вернуть в основной метод main

 

[Modules]

Dim swApp As Object
Dim Kol_vo As String
Sub main()
    Set swApp = Application.SldWorks
    Koll.Show
    Debug.Print Kol_vo
End Sub
 
[Forms]
Private Sub CommandButton1_Click()
    Unload Me
End Sub
 
Private Sub TextBox1_Change()
 
    Kol_vo = Koll.TextBox1.Text
End Sub
 
Private Sub UserForm_Click()
 
End Sub
 

Как переменную Kol_vo вернуть в основной метод main для ее дальнейшего использования в расчетах. 

Прошу не обращать внимания. Вопрос решен.

Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте,

В данном макросе контексты использованы правильно. Попробуйте закомментировать всю логику (чтение и запись свойств), кроме обновления списка вырезов. Обновляется ли сейчас?

 

 

Я в очередной раз Вам очень благодарен за ответ на форуме. Но к сожалению половину не понял. Если Вас не затруднит могли бы Вы объяснить эту цепочку

 

"Вы работаете со сборкой, то тогда этот элемент должен быть получен через цепочку IComponent2::FirstFeature->IFeature::GetNext, а не IComponent2::GetModelDoc2->IModelDoc2::FirstFeature->IFeature::GetNext. Самым простым методом проверить будет вызвать IFeature2::Select2 для Вашей папки вырезов и убедится, что он выделяет в активном документе."

 

У меня в макросе цепочка следующаяя

 

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim Massiv() As Variant

---------------------------------------------------------------------------------------------------------------------

Sub main()

 

      Set swApp = Application.SldWorks
      Set swModel = swApp.ActiveDoc
      boolstatus = swModel.EditRebuild3()

      .......

      Massiv = CreateArray(swModel)

      TraverseAssembly swModel, Massiv

      ......

End Sub

---------------------------------------------------------------------------------------------------------------------

Function CreateArray(swAssy As SldWorks.AssemblyDoc)

 

     Dim vComps As Variant

     Dim swComp As SldWorks.Component2

     ......

     vComps = swAssy.GetComponents(False)

     For i = 0 To UBound(vComps)

          Set swComp = vComps(i)

          ......

          Set Massiv(20, line) = swComp

          ......

     Next

     CreateArray = Massiv

End Function

---------------------------------------------------------------------------------------------------------------------

Sub TraverseAssembly(swAssy As SldWorks.AssemblyDoc, Massiv)
 
    Dim swComp As SldWorks.Component2
    .........
    For i = 0 To UBound(Massiv, 2)
        Set swComp = Massiv(20, i)
        ReadProperties swComp.FirstFeature, swComp.GetModelDoc2(), swComp.ReferencedConfiguration, Massiv, i
    Next
End Sub

---------------------------------------------------------------------------------------------------------------------

Function ReadProperties(swFeat As SldWorks.Feature, swModel As SldWorks.ModelDoc2, confName As String, Massiv, i)

          

          Dim swFolder As SldWorks.BodyFolder

          .......

          swFolder = swFeat.GetSpecificFeature2

          boolstatus = swFolder.UpdateCutList() '<<<-- Критическая ошибка с закрытием Солида

          ......

End Function

---------------------------------------------------------------------------------------------------------------------

 

Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте,

В данном макросе контексты использованы правильно. Попробуйте закомментировать всю логику (чтение и запись свойств), кроме обновления списка вырезов. Обновляется ли сейчас?

Увы нет не обновляется

Вот принтскрин

 

Я ушел от UpdateCutList() и заменил его жесткой перерисовкой всего проекта (при этом пересчитывается и перерисовуется все) ForceRebuild3(False). Один минус сильно упала скорость работы макроса.

post-50968-0-60178300-1451943039_thumb.png

Изменено пользователем science
Ссылка на сообщение
Поделиться на других сайтах

Добрый день! Подскажите пожалуйста: 

Как получить значения измерения из датчика?

 

Если тип датчика размер то получить удается!  Делал так:

Private Function swPart_SensorAlertPreNotify(ByVal SensorIn As Object, ByVal SensorAlertType As Long) As Long
    Dim Value As Double, Units As String
    Dim swSensor As SldWorks.Sensor
    Set swSensor = SensorIn
    With swSensor
        Debug.Print .GetSensorValue(Value, Units), Value, Units
    End With
End Function
Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте,

Прошу на помощ. А у меня такой вопрос:

Делаю експорт на .dxf с помощью swPart.ExportToDWG2 dxfPath & "_" & swFeat.Name & ".dxf", path, 1, True, "", False, False, 65, Null

Потом, когда я открываю файл с Draftsight "Dimension style->Linear dimension->Scale factor" он имеет значение на 1; 2; 5; 20 ...

Как могу сделать это всегда на 1?

Ссылка на сообщение
Поделиться на других сайтах

sw 2012 win 7x64

Привет всем!

Подскажите как с помощью VBA настроит цвет чертежа в параметрах страницы.

Метод .IPageSetup.DrawingColor=, описанный в справке результатов не дал. Может есть другое решение.

Ссылка на сообщение
Поделиться на других сайтах

Доброго времени суток.

 

 

Добрый день! Подскажите пожалуйста:  Как получить значения измерения из датчика?

 

Так понимаю что программно это очень сложно! (не стал заморачиваться)

 

Еще вопрос: Если событие в sldAsm то отрабатывает корректно, если в sldPrt то swComp = nothing - почему?

Private Function PropertyManagerPage2Handler9_OnSubmitSelection(ByVal Id As Long, ByVal Selection As Object, ByVal SelType As Long, ItemText As String) As BooleanDim swComp As Component2
    Set swComp = Selection.GetComponent ' тут какой то косяк! Selection = Face (у Selection даже метода то кого нет!)
    If swComp Is Nothing Then swModel = Selection
    Set swModel = swComp.GetModelDoc2
    Set swCustProp = swModel.Extension.CustomPropertyManager(swComp.ReferencedConfiguration)
    If Not dicFace.Exists(Selection) Then dicFace.Add Selection, swCustProp
         PropertyManagerPage2Handler9_OnSubmitSelection = True
    End If
End Function
Изменено пользователем Homasters
Ссылка на сообщение
Поделиться на других сайтах
Вы в детали хотите получить сборочный компонент?
 

Может до конца не понимаю (структуру SW т.к недавно работаю)!?

В общем хочется получить swModel и после CustomPropertyManager

Ссылка на сообщение
Поделиться на других сайтах

Подскажите пожалуйста как сохранить  пот сборку или деталь из сборки с сохранением связи, то есть сохранить деталь или сборку во внешнем файле.

 

Приведенный код сохраняет файл но без связи с основной сборкой, то есть под сборка становится отдельной сборкой и изменение деталей в нутри нее не приводит к перестройки подборки в основной сборке.

 

Set swModel = swApp.OpenDoc6(Massiv(22, line).GetPathName, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", 0, 0)
swApp.ActivateDoc3 swModel.GetTitle(), False, swRebuildOnActivation_e.swDontRebuildActiveDoc, 0
longstatus = swModel.SaveAs3(FileName, 0, 2)
Изменено пользователем science
Ссылка на сообщение
Поделиться на других сайтах

@@science, для сохранения подсборок отдельно от головной сборки используйте Pack And Go


В общем хочется получить
судя по приведённому коду, вы хотите получить нейкий объект dicFace, так может сначала просто сформулируете вопрос правильно?  :smile:
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.



×
×
  • Создать...