Программа для работы с параметрическими моделями

Автор Sprinter500, 14.06.11, 16:52:25

« назад - далее »

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

Sprinter500

Здравствуйте!
Есть идея написать программу или библиотеку, которая бы:
1. Меняла один из параметров с заданным шагом, с одновременной перестройкой 3D модели, и при этом происходил расчет МЦХ, и на основе полученных данных строился график.
2. Поиск значения параметра по заданному значению МЦХ (масса или объем).
3. Поиск оптимального значения по заданным условиям (необязательно МЦХ).

Для этого необходимо иметь программный доступ к параметрическим переменным 3D модели и доступ к данным МЦХ. Кто нибудь знает как это делается?


Sprinter500

А подробнее? Если сделаю то выложу для всех на бесплатной основе. Думаю востребованной будет :) Так что нужна помощь. Могу написать в Visual Basic алгоритм любой сложности, но в API Компаса я не силен :(

IParametriticConstraint->ksConstraintTypeEnum – Типы параметрических ограничений.
ksCDimWithVariable - 13 - Размер с переменной

IParametriticConstraint
Интерфейс позволяет получить доступ к параметрическому ограничению в 2D документе.
Изменение параметров ограничения возможно на этапе создания ограничения. Создать ограничение можно при помощи метода IDrawingObject1::NewConstraint.
Если необходимо отредактировать параметрическое ограничение, то его нужно удалить и создать новое с нужными параметрами.
Примечание:
1. Аналоги интерфейса в API5:
API Экспортных функций:
- Структура параметров: ConstraintParam.
Функции:
- ksSetObjConstraint - Установить параметрическое ограничение.
- ksDestroyObjConstraint - Разрушить параметрическое ограничение.
Automation:
- ksConstraintParam - Интерфейс параметров для параметрических ограничений.
Методы:
- ksDocument2D::ksSetObjConstraint- Установить параметрическое ограничение.
- ksDocument2D::ksDestroyObjConstraint - Разрушить параметрическое ограничение.
2. В API5 нельзя создать или получить ограничения следующих типов:
- Ассоциативная связь.
- Размер с переменной.
- Фиксированный размер.

В любом случае примеров у меня нет, главное не опускайте руки и все у Вас получится.

PS

Модели могут быть разные, как Вы представляете себе это должно работать?
На мой вгляд, проще это описать переменными (без программирования) в конкретной модели.

chelkar

Если Вы хотите управлять переменными, которые на всю модель (в самом верху в панели Переменные), то берите их через IPart::VariableCollection.
У самой переменной есть все что необходимо
Имя - IVariable::name
Значение - IVariable::value
Комментарий - IVariable::note

Дальше меняем значения и делаем IPart::RebuildModel
Модель перестраивается, берем у нее МЦХ через интерфейс IMassInertiaParam, сравниваем с оптимуммом и повторяем итерацию.

Sprinter500

Начал делать. Но сразу дело встало. Знаю что я чайник, но не работает следую щий код:

Private Sub Command1_Click()
Dim k As Double
Set ICV = iMassInertiaParam7.Calculate()
k = iMassInertiaParam7.Volume
Print k
End Sub

Где ошибка? Хотел для начала чтобы выводилось значение объема созданного в окне Компаса тела

Sprinter500

Для переменных тоже неудача:

Private Sub Command2_Click()
Dim f As Object
Dim d As Double
Set IVariable = IPart.VariableCollection
Set f = IVariable.Name("TR")
d = f.Value
Print d
End Sub

А так не пробовали AddNewVariable( BSTR name, double value, BSTR note );
Добавить новую переменную.
Входные параметры:
name - имя переменной,
value - значение переменной,
Note - коментарий к переменной.
Возвращаемое значение: указатель на интерфейс внешней переменной модели ksVariable или IVariable.
Примечание:Переменную можно добавлять только для ksFeature и IFeature.

Sprinter500

Мне не новую переменную вводить надо, а считывать и менять существующие в модели или чертеже переменные

IVariableCollection не имеет свойства Name.
Вам нужно получить IVariable <-- IVariableCollection.GetByName

Sprinter500

Теперь сделал так:

Option Explicit
Public IPart As Object
Public IVariable As Object
Public iMassInertiaParam7 As Object
Public ICV As Object


Private Sub Command2_Click()
Dim f As Object
Dim d As Double
Set IVariable = IPart.VariableCollection
Set f = IVariable.GetByName("TR")
d = f.Value
Print d
End Sub


Всеравно выскакивает ошибка на : Set IVariable = IPart.VariableCollection

#12
Какая ошибка? В её названии уже 90% ответа, где искать.
Set f = IVariable.GetByName("TR")
У GetByName (BSTR name,BOOL testFullName,BOOL testIgnoreCase); три параметра.

Public IVariable As Object
Public (оператор) - используется на уровне модуля для объявления Public переменных и выделяет место в памяти для их хранения
Dim (оператор) - объявляет переменные и выделяет память под них
http://www.vbrussian.com/Article.asp?ID=30


Sprinter500

Про Public и Dim я хорошо знаю. Писал на VB сложнейшие алогритмы, но никак немогу разобраться с API Компаса. Реализовал только то что было в примерах SDK. А шаг влево или вправо не могу сделать. :) Что означают остальные 2 переменные в GetByName ? Вот бы найти учебник по API Компаса, в имеющейся справке в кратко до безобразия, сухо очень :(

SDK - GetByName(BSTR name,BOOL testFullName,BOOL testIgnoreCase)
Входные параметры:
name - имя объекта,
testFullName - признак полного имени:
TRUE - name - полное имя,
FALSE - имя name может быть частью полного имени,
testIgnoreCase - признак игнорирования регистра символов имени:
TRUE - игнорировать регистр,
FALSE - учитывать регистр.


Sprinter500

Теперь сделал так:

Private Sub Command2_Click()
Dim f As Object
Dim d As Double
Set IVariable = IPart.VariableCollection
Set f = IVariable.GetByName("TR", True, True)
d = f.Value
Print d
End Sub

Но ошибка вылазит раньше на : Set IVariable = IPart.VariableCollection
Что то не так

#16
Каким образом Вы IPart получаете? Если Public IPart As Object единственное упоминание, то этого тоже не достаточно. Какая ошибка?  :o

ainis

Вот работающая процедура получения внешних переменных детали, созданной в профессиональном Компасе:

Public Sub GetArrayListFromDet(ByVal iKompas As Kompas6API5.KompasObject, _
                                   ByVal iPart As Kompas6API5.ksPart)
    Try
        Dim KVarArray As Kompas6API5.ksVariableCollection = iPart.VariableCollection
        If KVarArray Is Nothing Then Exit Sub
        If KVarArray.GetCount = 0 Then Exit Sub
        Dim I As Integer
        For I = 0 To KVarArray.GetCount - 1
          Dim KVar As Kompas6API5.ksVariable = _
             iKompas.GetParamStruct(StructType2DEnum.ko_VariableParam)
          KVar = KVarArray.GetByIndex(I)
          If KVar IsNot Nothing Then

           'Получаем значение переменной KVar, например, так:
            d As Double = KVar.value
           
          End If
        Next
      Catch ex As Exception
        Exit Sub
      End Try
    End Sub

Sprinter500

Спасибо за код, но что то VB6 "ругается" почти на каждой строчке. Вы случаем не на VB.NET написали? Если на VB6 - не могли бы Вы мне скинуть целый модуль.

ainis

Да, писал на VB.NET. На VB6 уже давно не программирую, так что особенностей его не помню. :)
Но не думаю, что перевод на VB6 может вызвать большие трудности.
Если правильно переданы iKompas и iPart, то процедура должна работать.
Вот еще что: возможно, проблема будет с символом переноса строки "_" . Тогда его нужно просто убрать, т. е., например, вместо

Dim KVar As Kompas6API5.ksVariable = _
       iKompas.GetParamStruct(StructType2DEnum.ko_VariableParam)


написать

Dim KVar As Kompas6API5.ksVariable = iKompas.GetParamStruct(StructType2DEnum.ko_VariableParam)